【问题标题】:Windows, Linux and Memory ManagementWindows、Linux 和内存管理
【发布时间】:2009-07-14 20:53:47
【问题描述】:

我很好奇 Windows 和 Linux 如何使用 C++ 程序进行内存管理。

之所以好奇是因为我刚刚用 C++ 编写了 3 个非常简单的程序,可以在 Linux 和 Windows 之间移植。代码完全相同。硬件也是。但结果却大不相同!两次测试重复10次,然后计算算术平均值。

我已经在静态整数数组、类向量和堆栈(使用指针)上测试了顺序插入。插入总数为 10^6。

Windows XP SP2 x86 结果: 静态整数数组:56 ms 类向量:686 毫秒 堆栈(带指针):2193 毫秒

Slackware 11 x86 结果: 静态整数数组:100 ms 类向量:476 毫秒 堆栈(带指针):505 毫秒

Windows 和 Slax 上的堆栈插入时间之间的速度差异令人印象深刻。这些结果看起来正常吗?这两个代码都是使用 G++(Windows 上的 mingw32-g++)编译的。

使用的计算机是双核 3.2Ghz 和 4GB RAM,在进行测试时,有超过 2GB 的可用 RAM。

【问题讨论】:

  • 这不是问题。 (提示:问题通常以问号“?”结尾)。
  • 我认为问题是 - 为什么它们如此不同?
  • “这些结果看起来正常吗?”符合条件?
  • 我认为我们可以稍微松懈一下并推断“堆栈(带指针)的显着差异是如何产生的?”
  • @Eric Petroelje,jmanning2k,djna 是的,这是我的问题。很抱歉没有让它更客观。

标签: c++ windows linux


【解决方案1】:

这可能与 C++ stdlib 实现(Microsoft MSVC 与 GNU libc/stdc++)有关,而不是内存管理...

C++ 设定规范,但实现差异很大。

更新:我现在注意到您在两个平台上都使用了 g++ - 好吧,它仍然是一个不同的实现。并且 GNU 代码是为 Unix 环境开发的,后来被移植到 Windows - 所以它可能会做出不适合 Windows 环境的假设和优化。

但是您最初的问题是有效的。它可能与操作系统的底层内存模型有关 - 但您在这里的测试过于粗略,无法得出任何结论。

如果您运行更多测试,或尝试使用不同的标志/编译器,请发布一些更新的统计信息,它们会提供信息。

【讨论】:

  • +1 投票在这里。对于 Farofeiro,您应该尝试使用 MS 编译器而不是 gcc 在 Windows 上进行编译。它可能(但只是可能)让它变得更好。
  • 好的,我可以试试这个。但为什么你认为它应该更好?用于 windows 的 G++ 没有针对它进行很好的优化,或者 VS 使代码对 windows 进行了更多优化?
【解决方案2】:

100 万次插入需要 2 秒,这有点太高了。您是否启用了优化?没有它们,这些数字毫无意义。

编辑:由于您在没有优化的情况下编译,请启用它们(例如使用 -O2)并再次测量。差异可能会小得多。标准库往往具有很强的防御性,并且会执行大量的一致性检查,这可能会严重影响测量结果。

编辑:如果即使启用了优化,它仍然需要超过 2 秒,那么还有其他事情发生。尝试发布一些代码。下面的程序在我的系统上在 cygwin 下运行了大约 40 毫秒。

#include <stack>

int main()
{
    std::stack<int> s;
    for (int i = 0; i < 1000000; ++i)
        s.push(i);
}

【讨论】:

  • 不,我没有启用任何优化。但是我编译 windows 版本的方式和我编译 Linux 的方式完全一样。
  • 好的,我刚刚重新编译了 windows 版本,现在堆栈在 2121 毫秒内完成了 10^6 次插入。有减少,但差异仍然很大。我只用 -O2 标志编译了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 2011-11-29
相关资源
最近更新 更多