-1

std::swapandのパフォーマンスの違いをテストしようとしていて、オプションvector::swapを使用してコンパイルした場合と使用しない場合でコンパイルしました。-std=c++0xこのオプションを含めないと、プログラムの実行速度が速くなり、約 200 ミリ秒の違いがあることに気付きました。

#include <iostream>
#include <string>
#include <vector>

int main()
{
    commentator.setReportStream (cout);

    size_t nbElts = 2048;
    vector<int> v, w;

    v.resize (nbElts);
    w.reserve (nbElts);

    for (int i = 0; i < nbElts; ++i) {
        w.push_back (i);
    }

    commentator.start ("std::swap", __FUNCTION__);
    for (int i = 0; i < 10000000; ++i) {
        std::swap (v, w);
    }
    commentator.stop (MSG_DONE);

    commentator.start ("vector::swap", __FUNCTION__);
    for (int i = 0; i < 10000000; ++i) {
        v.swap (w);
    }
    commentator.stop (MSG_DONE);
    return 0;
}

コメンテーター オブジェクトは、実行時間を示します。運行時間の違いはなぜですか? gcc バージョン 4.6.3 20120306 (Red Hat 4.6.3-2) (GCC)

-std=c++0x なしの実行時間

std::swap...done (0.319952 s)
Completed activity: std::swap (r: 0.3214s, u: 0.32s, s: 0s) done

vector::swap...done (0.26396 s)
Completed activity: vector::swap (r: 0.2652s, u: 0.264s, s: 0s) done

-std=c++0x を使用

std::swap...done (0.548917 s)
Completed activity: std::swap (r: 0.5507s, u: 0.5489s, s: 0s) done

vector::swap...done (0.508922 s)
Completed activity: vector::swap (r: 0.5105s, u: 0.5089s, s: 0s) done
4

1 に答える 1

8

使用している G++ のバージョンも、コンパイル時に指定したフラグもわかりません。

しかし、コードが数百万回のポインター スワップ (C++0x でのベクターのスワップ) を行うのに 0.5 秒かかる場合、最適化を有効にせずにコンパイルしていると言って差し支えないと思います。最適化せずにコードのベンチマークを行っていると、役に立たないデータが得られ、時間を無駄にしています。コードの速度が気になる場合は、コンパイラに高速なコードを生成するように指示してから、違い測定してください。

于 2012-05-03T17:51:55.497 に答える