ログイン

2016年3月 弊社ホームページは新しくなりました。 https://thinkridge.com

メインメニュー

携帯公式サイト


携帯電話をもっと便利に
もっと楽しく


史上初の吹奏楽専門着メロサイト


POPで癒しでライトでとんがって気持ちのいい〜オルゴール着メロをあなたに

Magome

クラウドベースの MIDI シーケンサ Magome

音楽制作に興味のある方を対象に、スタンドアロンでも使え、ネットならではの面白さも兼ね備えた音楽制作アプリの提供を目指しています

for 携帯電話

https://thinkridge.com/m/
ケータイはこちらへ

VisualStudio2005,2008,2010 のコンテナの速度比較

コーディング小手先テクニックとは多少毛色が違うかもですが、なんとなく VisualStudio2008(VC9) の吐き出すコードが、どうにも遅いような気がしたので試してみました。
ちょっと面白い結果だったので、記載してみます。

std::vector (と、ついでに std::list ) を、上からなめるコードで試してみました。
VisualStudio2005sp1 2008sp1 2010 の3種類で比較です。
各コンパイラの条件はすべて同じハズで、
・最適化オプションは
 実行速度優先(/O2)
 インライン関数の展開(/Ob2)
 組み込み関数を使用する(/Oi)
・_SECURE_SCL はデフォルト(有効)です。
・ヘタに最適化されないように、処理はDLLに逃がしてあります。
・boost は 1.42 を使わせて頂いてます。( bind と function のみ使ってます)
・STL は、それぞれのコンパイラの純正付属品です。


で、以下が結果と考察です。
コンテナ処理所要時間(ms)
vs2005spvs2008sp1vs2010
vectorVector_For11298746310
Vector_For26427334312
Vector_StdBind2nd307913307
Vector_BoostBind3061267308
Vector_Tr1Bind-914307
Vector_BoostBind_FuncPtr90132431051
Vector_Tr1Bind_FuncPtr-16531059
Vector_BoostFunction_StdBind2nd101639381229
Vector_Tr1Function_StdBind2nd-24601137
Vector_BoostFunction_BoostBind_FuncPtr152363441971
Vector_Tr1Function_Tr1Bind_FuncPtr-35861764
listList_StdBind2nd179341451790
List_BoostBind178740601787
List_Tr1Bind-34291790
+  コード
  • vs2005 2008 2010 をざっくりと比較すると、vs2005 ≒ vs2010 >> vs2008 という感じで、理由はまったくわからんのですが vs2008 はダントツで遅いコードを吐き出すようです。
  • tr1 と boost の比較では、tr1 のほうが早いみたいです。vs2010 はそれ程変わらないですが、vs2008 は最大で2倍くらい tr1 版のほうが早いようなので、vs2008 なら積極的に tr1 を使っといたほうがよさげです。(それでも vs2005 vs2010 には遠く及ばないです)
  • vs2008sp1 は、最適化オプションの「インライン関数の展開」を「既定値」だと極端に遅くなるようで、ここには記載してませんが、大体2〜4倍くらい遅くなりました。vs2008 ではこの設定の変更は必須な感じです。
  • bind は、関数ポインタを渡すより、関数オブジェクトを渡しといたほうが早いようです。関数ポインタであっても、インライン展開されて同程度になるんじゃなかろうかと思ってたんですが、今のところそんなことはないみたいです。
    inline bool f(const int &a,const int &b)
    {
        return a > b;
    }
    void func(const std::vector<int> &v,int n)
    {
       std::find_if( v.begin(), v.end(), boost::bind(&f,_1,n) );                   // 遅し
       std::find_if( v.begin(), v.end(), boost::bind(std::greater<int>(),_1,n) );  // 早し
    }
  • bind2nd(bind1st) と bind を比較すると、vs2005 と vs2010 はほぼ同じっぽいですが、vs2008 ならば bind2nd(bind1st) のほうが若干早いみたいです。どっちでも書けるときには bind2nd(bind1st) を使っといたほうがよさげです。
  • for 文の最適化は、vs2010 が良いみたいです。vs2005 と vs2008 は、終了条件に vector::end() を使うと遅くなるようなので、事前に vector::end() をローカル変数に持たすとかしたほうがよさげです。
    void func(const std::vector<int> &v)
    {
       for(std::vector<int>::const_iterator i=v.begin(); i!=v.end(); ++i);         // 遅し
     
       const std::vector<int>::const_iterator e = v.end();
       for(std::vector<int>::const_iterator i=v.begin(); i!=e; ++i);               // 早し
    }
  • function をかますとやっぱり遅くなるようです。
というわけで、まとめとして、

案の定、VisualStudio2008 の吐き出すコードは遅いという感じでした。vs2005 よりかなり遅いっていうのが、ちょっと残念な印象です。
その点、vs2010 は優秀っぽいです。モノによっては 2005 に負けるみたいですが、for の最適化から察するに、複雑なコードで本気を出す燻し銀的な感じかもしれません。
vs2010 は、開発環境としては、重いし、画面崩れまくるし(←僕の手元ではです)で、ちと印象悪いんですが、コンパイラとして見ると良いものかもしれません。
最後に補足。

まず、これにつかったベンチマークプログラムが、大量のデータを単純になめるというものです。実用上よくあるコードかというとそうでもないと思いますので、参考程度ということで御願いします。
最適化オプションやコンパイラの得手不得手、さらには、ベンチマークコードのミスということもあるかもしれません。
ソース一式を添付しますので、もしミスなどあれば是非ともご指摘など頂き度。

よろしく御願いいたします。
プリンタ出力用画面

前のページ
STL と MFC の map 速度比較
コンテンツのトップ