此代码在我的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秒才能释放内存,在我的firend(win7 x64)中甚至超过1分钟。
答案 0 :(得分:12)
嗯......我扩展了你的代码以包括时间:
#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 ++编译:{{1}}
同样,我用g ++编译,使用:cl /O2b2 /GL test_list.cpp
然后我跑了两个。
用VC ++我得到了:g++ -O3 test_list.cpp
用g ++我得到了:Time: 1.293
。
这是一个足够小的差异,我认为我需要测试更多,以确定VC ++产生了显着更快的代码,但我认为这足以支持一个结论VC ++ 不显着产生更慢的代码。
您需要启用计时结果的优化来表示任何内容。
答案 1 :(得分:-4)
如果您使用Windows并担心性能,请不要使用STL容器。功能相当的ATL容器类通常很多更快。
在我的笔记本电脑(i5-2410M CPU,Windows 7 64)上,您的示例(在使用Visual Studio 2010 for 64版本的Release版本中编译时)在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是我自己的使用高分辨率计时器的类。