0

私は自分のプログラムをテストし、一度、BOOST_FOREACHマクロを で単純なforサイクルに変更することにしましたconst_iterator

そして私は予期しない結果を受け取ります:プログラムの動作が遅くなりforます。

それから私は小さなテストアプリを書きました:

std::vector<int> vec;
for (int i = 0; i != 50000000; ++i)
    vec.push_back(i);



time_t t1 = clock();
int sum1 = 0;
for (std::vector<int>::const_iterator it = vec.begin(); it != vec.end(); ++it)
    sum1 += *it;
std::cout << ulong(clock() - t1);

time_t t2 = clock();
int sum2 = 0;
BOOST_FOREACH(auto &it, vec) {
    sum2 += it;
}
std::cout << ulong(clock() - t2);

ここに出力があります:

34963
26964

なんでそうなの?

4

1 に答える 1

5
  1. コードに未定義の動作があります。0+...+50,000,000 の合計は、MAX_INT をはるかに超えています。整数オーバーフロー == 未定義の動作、未定義の動作 == あなたのテストは無効です。

  2. 完全な最適化をオンにしてプロジェクトをビルドしたと仮定すると、CPU のウォームアップと、2 番目のベンチマークでは、データの一部が既にキャッシュされているという事実のために、結果が生じると推測しています。ベンチマークテストを切り替えてみて、何が起こるか見てみましょう

于 2016-05-27T11:13:19.260 に答える