C++のfor_eachについて
この前、for_eachはforより抽象化レベルが高くて、関数分離しやすいというメリットがあるので、C++11使うなら、なるべくforではなく、for_eachを使った方がいいよという話があって、”速度はどうなるの?”と聞かれて、内部ではiteratorを使っているから、同じになるじゃないかと思うが、自信がないです。そのため、速度を測りました。
ソースコードは以下のようになります
#include <iostream>
#include <algorithm>
#include <vector>
int main(int argc, char *argv[])
{
const size_t n = 9000000000;
std::vector<size_t> arr(n);
size_t each_count = 1;
auto start_each = std::chrono::system_clock::now();
std::for_each(arr.begin(), arr.end(), [&](size_t &i){
i = each_count++;
});
auto end_each = std::chrono::system_clock::now();
std::cout << "for_each:" << (end_each - start_each).count() << std::endl;
size_t for_count = 1;
auto start_for = std::chrono::system_clock::now();
for (size_t i = 0; i < arr.size(); i++) {
arr[i] = for_count++;
}
auto end_for = std::chrono::system_clock::now();
std::cout << "for :" << (end_for - start_for).count() << std::endl;
return 0;
}
テストOSははmacOS Sierra、メモリは8GB、CPUは2.4 GHz Intel Core i7です。最適化についてO2を付けました。
複数回で実行して、平均をとると、
for_each: 30059
for : 30824
結論として、for_eachを安心に使ってください。