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秒かかり、私のfirend(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

それから私は2つを実行しました。

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) では、例 (64 ビット用の Visual Studio 2010 を使用してリリース ビルドでコンパイルした場合) は 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 に答える