Take's Software Engineer Blog

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

Vectorを使うときの初期化速度計測した

f:id:monokuma12:20200905142104j:plain

Vectorを使うときの初期化
  • Vectorって動的な配列くらいのイメージしかもっていない
  • 初期化の方法なんて何でもいいじゃん

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

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

今回の記事はVectorの初期化について、どう書くと遅くなるのかを計測したので、その結果をお伝えしたいと思います。

この記事を読むことで特定ケースでは、早い書き方を自信を持って言えるようになるかなと思います。

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

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

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

aeroastro.sd.tmu.ac.jp

 

 

初期化方法
  • push_backで配列を用意する
  • reserveで配列を用意する

調べると配列の用意する手段は2点あります。

push_backという形で、for文を回し、一個ずつお尻に追加する方法と

reserveというガッと初期化してしまう手段があるようです。

reserveのほうが早そうだよなぁと感覚的に思いますよね。

 

 

計測結果
  • push_back:16664msec
  • reserve:93.75 msec
    おまけ:1で初期化する場合は100msecかかる

結果を見ると160倍の差分が出ました。
push.backで要素を追加するとめっちゃ遅いですね。あらかじめ要素数がわかっているのであれば、reserveのほうが爆速ですね。

初期化後1埋めするプログラムの速度も計測したら、7msec遅くなりったので、7msec程度時間がかかるようですね。

 

ソースコードは以下に。

gistb82f8fb7b73421a6c06c35c8686de482

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