Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows与Linux内存分配/std::列表构造函数性能 我将C++代码移植到Linux上。在这一过程中,我发现在Windows下(在完全相同的硬件上),以下线路的速度要慢约10倍: list*item=新列表[160000];_C++_Windows_Linux_Stl_Memory Management - Fatal编程技术网

Windows与Linux内存分配/std::列表构造函数性能 我将C++代码移植到Linux上。在这一过程中,我发现在Windows下(在完全相同的硬件上),以下线路的速度要慢约10倍: list*item=新列表[160000];

Windows与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 知道为什么会发生这种情况吗?我认为这条指令在两个操作系统中花费的时间都比较少(不管发生什么)。在这种情况下,您可能需要花费很少的时间来实际

在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];