为什么在VC ++中列出:: push_back要比g ++慢得多?

时间:2012-11-27 15:43:39

标签: c++ performance list visual-c++ g++

此代码在我的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分钟。

2 个答案:

答案 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是我自己的使用高分辨率计时器的类。