0

私は自分のプログラムでに置き換えるstd::vectorと思ったstd::arrayので、テストを続けました:

template<typename T> class A{
    public:
    void sub_run(T w){
        w[0] = 0.5;
        w[1] = 1.5;
        w[2] = 2.5;
        w[3] = 0.0;

        for (int i = 0; i < 100000000; i++)
        {
            w[0] = i *0.5;
            w[1] = i *1.5;
            w[2] = i *2.5;

            w[3] = w[0] + w[1]*w[2];
        }
    }
};

int main(){

    // Vectors    
    /*
    A<vector<double> > inst_a;
    vector<double> w(4);
    inst_a.sub_run(w);
    */
    // 1.71 sec

    // C-array
    /*
    A<double *> inst_a;
    double w[4];
    inst_a.sub_run(w);
    */
    // 1.03 sec

    // std::array

    A<array<double,4> > inst_a;
    array<double,4> w;
    inst_a.sub_run(w);

    // 3.31 sec

    return 0;
 }

まあ、出力は十分に奇妙です - はstd::arrayC アレイよりも 3 倍遅く、 よりもさらに遅いですvector。最適化は適用されませんでした。唯一のフラグは-std=c++11です。何が間違っている可能性がありますか?

4

1 に答える 1

3

Optimization に関するGCCのドキュメントから:

最適化オプションがない場合、コンパイラの目標は、コンパイルのコストを削減し、デバッグで期待される結果を生成することです。ステートメントは独立しています。ステートメント間のブレークポイントでプログラムを停止すると、任意の変数に新しい値を割り当てたり、プログラム カウンターを関数内の他のステートメントに変更したりして、ソース コードから期待どおりの結果を得ることができます。

-O オプションを指定しないと、GCC はパフォーマンスを気にしません。gdbまたは他の同様のツールを使用したデバッグを気にします。可能な限り高速に実行されるプログラムを実際にコンパイルするには、-Oオプションを使用する必要があります。たとえば、-O2.

于 2014-10-20T12:09:14.170 に答える