for vs range based for vs for_each
c++でループを回す方法として、for, range based for, for_each がある。
どれが速いのか気になったので測ってみた。
要素が100000個あるvectorの全ての要素を2倍するというタスクで比較してみた。
① for
std::vector<int> vec1(100000, 1); for (int i = 0; i < vec1.size(); ++i) { vec1[i] *= 2; }
② rage based for
range based for は c++11で追加された機能。
詳しくは:
範囲for文 - cpprefjp C++日本語リファレンス
std::vector<int> vec2(100000, 1); for (int& v : vec2) { v *= 2; }
③ for_each
あまり知られていない機能ですが、いわゆるmapをする関数です。algorithmヘッダーにあります。
詳しくは:
for_each - cpprefjp C++日本語リファレンス
std::vector<int> vec3(100000, 1); std::for_each(vec3.begin(), vec3.end(), [](int& x) {x *= 2;});
結果
time[msec] | |
---|---|
①for | 2.2172 |
②range-based for | 4.9361 |
③for_each | 4.7552 |
forを使ったほうが2倍以上速いという結果になった。