Windows与Linux内存分配/std::列表构造函数性能 我将C++代码移植到Linux上。在这一过程中,我发现在Windows下(在完全相同的硬件上),以下线路的速度要慢约10倍: list*item=新列表[160000];
在Windows上大约需要10毫秒,而在Linux上大约需要1毫秒。请注意,这是平均时间。在Windows上运行此行100次需要约1秒 这在win32和x64上都会发生,这两个版本都是在发行版中编译的,速度是通过QueryPerformanceCounter(Windows)和(Linux)测量的 Linux编译器是gcc。Windows编译器是VS2010Windows与Linux内存分配/std::列表构造函数性能 我将C++代码移植到Linux上。在这一过程中,我发现在Windows下(在完全相同的硬件上),以下线路的速度要慢约10倍: list*item=新列表[160000];,c++,windows,linux,stl,memory-management,C++,Windows,Linux,Stl,Memory Management,在Windows上大约需要10毫秒,而在Linux上大约需要1毫秒。请注意,这是平均时间。在Windows上运行此行100次需要约1秒 这在win32和x64上都会发生,这两个版本都是在发行版中编译的,速度是通过QueryPerformanceCounter(Windows)和(Linux)测量的 Linux编译器是gcc。Windows编译器是VS2010 知道为什么会发生这种情况吗?我认为这条指令在两个操作系统中花费的时间都比较少(不管发生什么)。在这种情况下,您可能需要花费很少的时间来实际
知道为什么会发生这种情况吗?我认为这条指令在两个操作系统中花费的时间都比较少(不管发生什么)。在这种情况下,您可能需要花费很少的时间来实际测量计时器的分辨率。这可能更像是库实现的问题。我希望有一个 大多数情况下为单一分配,默认构造函数为
list
没有分配任何东西。所以你要衡量的是成本
列表的默认构造函数(执行160000)
我说“试着测量”,因为任何这么小的测量都是错误的
测量时钟抖动和分辨率比测量代码更重要
执行时间。您应该将其放入一个循环中,以执行它
足够频繁地获得几秒钟的运行时间。当你
为此,您需要采取预防措施以确保编译器
不会优化任何东西
在Linux下,至少要使用clock()
进行测量;墙
您从gettimeofday
获得的时钟时间非常依赖于其他内容
恰好同时发生。(不要在Windows下使用clock(),
但是,Windows的实现被破坏了。)我看到一场火焰之战正在兴起。。。无论如何,你可能应该在一个循环中做一些事情,这些数字可能并不意味着10毫秒容易被其他事情干扰。至少在几秒钟内测量。但即使这样,我也会猜测,在windows上分配内存的实际方法要慢一些。只需稍微玩转一下,让它更像你在程序中使用的模式。@EdHeal:我们修复了时间机器。您现在可以回到1998年,在那里过着幸福的生活。@UmNyobe:您找不到QueryPerformanceCounter并不意味着Windows“臃肿”。@EdHeal这与操作系统无关。您似乎在说,如果Doron关闭了一些服务,那么new
会更快。皮夫勒说我@DORONYACOBY VC10 STL列表构造函数在构造函数中分配一个(空)节点。在“构造”的情况下,这可能是一个很大的性能缺陷。另一方面,我不知道gcc STL在构建std::list时做了什么,也许它以大小换取速度,而VC STL则以速度换取大小。我/你必须看一下gcc版本的构造函数(-chain)。这对应用程序的性能有影响吗?我同意,这是衡量std::list
构造函数的成本,而不是内存分配。此外,使用分配然后放置-new[]
来分别度量这两个变量是很简单的。事实证明,列表是大部分时间的所在。
list<char*>* item = new list<char*>[160000];