【问题标题】:Windows vs. Linux memory allocation/std::list constructor performanceWindows 与 Linux 内存分配/std::list 构造函数性能
【发布时间】: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


【解决方案1】:

这可能更多是库实现的问题。我会期待一个 大多数情况下是单一分配,默认构造函数为list 不分配任何东西。所以你要衡量的是成本 list 的默认构造函数(执行 160000)。

我说“试图测量”,因为任何小的测量结果都是 测量时钟抖动和分辨率比测量代码更多 执行次数。你应该把它放在一个循环中,以执行它 经常足以获得几秒钟的运行时间。当你 这样做,您需要采取预防措施以确保编译器 没有优化任何东西。

在 Linux 下,您至少要使用clock() 进行测量;墙 您从gettimeofday 获得的时钟时间非常依赖于其他内容 恰好同时发生。 (Windows下不要使用clock(), 然而。 Windows 实现已损坏。)

【讨论】:

  • 我同意,这是衡量std::list 的构造函数的成本,而不是内存分配。此外,使用分配后跟 placement-new[] 分别测量这两者是微不足道的。
  • 事实证明是真的,列表 ctor 是大部分时间都去的地方。
【解决方案2】:

我认为这条指令在两个操作系统中花费的时间都更少(无论如何)。在这种情况下,您实际上可能正在测量计时器的分辨率。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-23
    • 2016-07-29
    • 1970-01-01
    • 2020-08-03
    • 2013-12-22
    • 1970-01-01
    • 2016-05-07
    • 2017-08-17
    相关资源
    最近更新 更多