Take's Software Engineer Blog

とあるメーカーソフトウェアエンジニアに聞きたいことを発信していきます。

Vectorを使うときのループの手段別に速度計測した

f:id:monokuma12:20200905142104j:plain

Vectorを使うときのfor文
  • Vectorって動的な配列
  • Vectorのループっていろいろあるけど、どれが効率的なんだろ?

C++で出てくるVectorってありますよね?Cから上がったprogrammerだとナニコレ何がおいしいの?って感じでわからないと思います。

私はCの組み込みソフトウェアエンジニアでしたが、とある事情でPCアプリケーションのエンジニアになりC++C#を日々学んでおります。PCアプリケーションの世界ではC++は高速化をするためにC++を使用しているため、高速化という分野は大事でかつどんなコードを書くとどう遅くなるかは、認識しておいたほうが良い分野です。

今回の記事はVectorのforループについて、いろいろ手段を変えて実験してみました。

この記事を読むことでこれくらい速度差があるんだぁーってわかっていただければ幸いです。

計測条件
  • PCのスペック
    • AMD Ryzen 5 3600 6-Core Processor                 3.60 GHz
    • メモリ16G
    • Visual Stdio 2019
  • QueryPerformanceFrequencyのタイマーで計測

msec以下の計測をしたかったので、QueryPerformanceFrequencyを使用しました。

このブログを参考に計測プログラムを作りました

aeroastro.sd.tmu.ac.jp

 

 

ループ方法
  • 初期化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++を使う理由は速度にこだわるから!っていうポリシーがある職場ならなおさらね。

 

ソースコードは以下に。

 

gist1770c6288606589f31f48032835e05d5

div #breadcrumb div{ display: inline;font-size:13px;}