Vectorを使うときのfor文
C++で出てくるVectorってありますよね?Cから上がったprogrammerだとナニコレ何がおいしいの?って感じでわからないと思います。
私はCの組み込みソフトウェアエンジニアでしたが、とある事情でPCアプリケーションのエンジニアになりC++やC#を日々学んでおります。PCアプリケーションの世界ではC++は高速化をするためにC++を使用しているため、高速化という分野は大事でかつどんなコードを書くとどう遅くなるかは、認識しておいたほうが良い分野です。
今回の記事はVectorのforループについて、いろいろ手段を変えて実験してみました。
この記事を読むことでこれくらい速度差があるんだぁーってわかっていただければ幸いです。
計測条件
msec以下の計測をしたかったので、QueryPerformanceFrequencyを使用しました。
このブログを参考に計測プログラムを作りました
ループ方法
- 初期化Int型でサイズ文回す
- 初期化Auto型でサイズ文回す
- 初期化int型でカウント回し
- 初期化イテレータで終わりまで
- foreachで回す
5つの上位を用意しました。
①for (int x : array) ②for (auto x : array) ③for (int i = 0; i < array.size();i++) ④for (vector<int>::iterator i = array.begin(); i != array.end(); i++) ⑤for_each(array.begin(), array.end(), Hoge)
の条件で計測してみました。
計測結果
- 初期化Int型でサイズ文回す:145.393400[ms]
- 初期化Auto型でサイズ文回す: 118.685600[ms]
- 初期化int型でカウント回し:2197.631800[ms]
- 初期化イテレータで終わりまで:59168.918500[ms]
- foreachで回す:1063.758600[ms]
結果を見るとイテレータで回すとめっちゃ遅いことがわかりました。
職場で見るコードは、Auto型でサイズ文回すことが多いものしか見たことなかったので、なぜ?という疑問も解消しました。
どんなプログラムにしろ、計測してみてみるっていうのは大事ですね。
処理の仕方も間違えている場合もあるので、個人の環境で、実際のロジックを使って計測して早いものを選ぶとよいと思います。
C++を使う理由は速度にこだわるから!っていうポリシーがある職場ならなおさらね。
ソースコードは以下に。