【发布时间】:2012-01-26 15:26:41
【问题描述】:
我正在将 C++ 代码从 Linux 移植到 Windows。在此过程中,我发现在 Windows 下(在完全相同的硬件上)以下行会慢约 10 倍:
list<char*>* item = new list<char*>[160000];
在 Windows 上大约需要 10 毫秒,而在 Linux 上大约需要 1 毫秒。请注意,这是平均时间。在 Windows 上运行此行 100 次大约需要 1 秒。
win32 和 x64 都会出现这种情况,两个版本都在 Release 中编译,速度是通过 QueryPerformanceCounter (Windows) 和 gettimeofday (Linux) 测量的。
Linux 编译器是 gcc。 Windows编译器是VS2010。
知道为什么会发生这种情况吗?
【问题讨论】:
-
我看到了一场激烈的战争……无论如何,你应该在一个循环中做一些事情,这些数字可能并不意味着 10ms 很容易被其他事情打扰。至少在几秒钟内测量。但即便如此,我猜想在 Windows 上分配内存的默认方式更慢。稍微玩一下,让它更像你在程序中使用的模式。
-
@EdHeal:我们修复了时间机器。你现在可以回到 1998 年,在那里过着幸福的生活。
-
@UmNyobe:找不到 QueryPerformanceCounter 的事实并不意味着 Windows“臃肿”。
-
@EdHeal 这与操作系统无关。您似乎在说,如果 Doron 关闭了一些服务,那么
new会更快。 Piffle 说我! -
@DoronYaacoby VC10 STL 列表构造函数在构造函数中分配一个(空)节点。在“构造”情况下,这确实是一个很大的性能缺陷。另一方面,我不知道 gcc STL 在构造 std::list 时做了什么,也许它以大小换取速度,而 VC 则以速度换取大小。我/你将不得不看一下 gcc 版本的构造函数(-chain)。这对您的应用程序有性能影响吗?
标签: c++ windows linux stl memory-management