这段代码在我的 VS2012 中大约需要 20 秒,但在 G++ 中只需要 1.x 秒。在 win8 x64 和使用默认选项编译。
list<double> items;
for(int i=0;i<10000000;i++){
items.push_back(rand());
}
cout<<"done"<<endl;
是关于内存分配的吗?在我的机器上用 VC++ 输出后释放内存需要 3~5 秒,在我的朋友(win7 x64)中甚至超过 1 分钟。
这段代码在我的 VS2012 中大约需要 20 秒,但在 G++ 中只需要 1.x 秒。在 win8 x64 和使用默认选项编译。
list<double> items;
for(int i=0;i<10000000;i++){
items.push_back(rand());
}
cout<<"done"<<endl;
是关于内存分配的吗?在我的机器上用 VC++ 输出后释放内存需要 3~5 秒,在我的朋友(win7 x64)中甚至超过 1 分钟。
嗯...我扩展了您的代码以包括时间:
#include <list>
#include <iostream>
#include <time.h>
#include <stdlib.h>
int main() {
std::list<double> items;
clock_t start = clock();
for(int i=0;i<10000000;i++){
items.push_back(rand());
}
clock_t finish = clock();
std::cout << "Time: " << double(finish-start)/CLOCKS_PER_SEC << "\n";
return 0;
}
我使用 VC++ 编译:cl /O2b2 /GL test_list.cpp
同样,我用 g++ 编译,使用:g++ -O3 test_list.cpp
然后我跑了两个。
使用 VC++ 我得到了:Time: 1.293
.
使用 g++ 我得到了:Time: 1.313
.
这是一个足够小的差异,我认为我需要进行更多测试才能完全确定 VC++ 产生了明显更快的代码,但我认为这足以支持 VC++没有产生明显更慢的代码的结论。
您需要打开时序结果的优化才能表示任何含义。
如果您在 Windows 上并且担心性能,请不要使用 STL 容器。功能等效的 ATL 容器类通常要快得多。
在我的笔记本电脑(i5-2410M CPU,Windows 7 64)上,您的示例(在使用 Visual Studio 2010 的 64 位发布版本编译时)在 740 毫秒内执行。当使用功能等效的 ATL 容器CAtlList<double>时,执行时间降至 370 毫秒。
与 Microsoft 的高级库相比,使用标准库的性能损失约为 50%。
这是源代码:
void list_stl()
{
std::list<double> items;
CBenchmarkTimer tt( "10M doubles in std::list" );
for( int i = 0; i < 10000000; i++ )
items.push_back( rand() );
tt.End();
}
void list_atl()
{
CAtlList<double> items;
CBenchmarkTimer tt( "10M doubles in CAtlList" );
for( int i = 0; i < 10000000; i++ )
items.AddTail( rand() );
tt.End();
}
CBenchmarkTimer 是我自己的使用高分辨率计时器的类。