6

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

4

2 回答 2

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++ 编译:cl /O2b2 /GL test_list.cpp

同样,我用 g++ 编译,使用:g++ -O3 test_list.cpp

然后我跑了两个。

使用 VC++ 我得到了:Time: 1.293.
使用 g++ 我得到了:Time: 1.313.

这是一个足够小的差异,我认为我需要进行更多测试才能完全确定 VC++ 产生了明显更快的代码,但我认为这足以支持 VC++没有产生明显更慢的代码的结论。

您需要打开时序结果的优化才能表示任何含义。

于 2012-11-27T16:00:42.820 回答
-5

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

于 2012-11-27T16:45:18.650 回答