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倍以上速いという結果になった。