0

ベクトルがメモリでどのように機能し、実行時に何が起こるかを理解するためだけに、小さな C++ プログラムを作成しました。

私のコードがあります:

#include <iostream>
#include <cstdio>
#include <ctime>
#include <vector>

int main(){

    clock_t start, end;

    int x;

    std::vector<int> a(5, 100);

    start = clock();

    for(int i = 0 ; i <= 900000000 ; i++){
        x = a[0];
        x = a[1];
        x = a[2];
        x = a[3];
        x = a[4];
    }

    end = clock();

    clock_t duration = end - start;

    double durationPerSec = duration / (double)CLOCKS_PER_SEC;

    std::cout << "Run-time : " << durationPerSec << std::endl;

    return 0;
}

そして、私はこの出力を得ました:

実行時間 : 18.7843

ベクトルを動的配列に置き換えて同じコードを書くと、実行時間はより受け入れられます:

実行時間 : 2.9526

私はこのコードが非常にばかげていることを知っていますが、ベクトルを使用すると実行時間が長いのはなぜですか? それは私の使い方が間違っているからなのか、それとも単に私が理解できないことがあるからなのか?

返信ありがとうございます。

4

2 に答える 2

1

私はそれを実行してg++ -O0 a.cc取得します

    Run-time : 18.99

しかし、私が使用する場合g++ -O2 a.cc

    Run-time : 0

よりアクティブにするために、2番目を実行しますtime ./a.out

time ./a.out
Run-time : 0

real    0m0.009s
user    0m0.002s
sys     0m0.002s

ループを次のように変更しました

for(int i = 0 ; i <= 900000000 ; i++){
    a[0] = i ;
    a[1] = i + a[0];
    a[2] =  a[1] + a[2];
    a[3] = i + a[1] + a[2];
    a[4] = i + a[1] + a[2] + a[3];
    x = a[0];
    x = a[1];
    x = a[2];
    x = a[3];
    x = a[4];
}

次に、の結果g++ -O2

time ./a.out
Run-time : 1.81

real    0m1.817s
user    0m1.811s
sys     0m0.001s
于 2013-09-27T14:44:46.610 に答える
0

最適化を有効にして測定する必要があります。

operator[]メンバー関数です。を使用して要素にアクセスする[0]と、実際には関数を経由するため、同じ表記法にもかかわらず、実行する命令が増えます。デバッグでは、測定可能なオーバーヘッドが発生します。リリース時には、通常は測定不能です。

于 2013-09-27T14:42:18.603 に答える