ページへ戻る
印刷
技術系備忘録/C++/最適化小手先テクニック/VisualStudio2005,2008,2010コンテナ速度比較
をテンプレートにして作成 ::
シンクリッジ
xpwiki
:技術系備忘録/C++/最適化小手先テクニック/VisualStudio2005,2008,2010コンテナ速度比較 をテンプレートにして作成
開始行:
コーディング小手先テクニックとは多少毛色が違うかもですが...
ちょっと面白い結果だったので、記載してみます。
std::vector (と、ついでに std::list ) を、上からなめるコ...
VisualStudio2005sp1 2008sp1 2010 の3種類で比較です。
各コンパイラの条件はすべて同じハズで、
-最適化オプションは
---実行速度優先(/O2)
---インライン関数の展開(/Ob2)
---組み込み関数を使用する(/Oi)
--_SECURE_SCL はデフォルト(有効)です。
--ヘタに最適化されないように、処理はDLLに逃がしてあります。
--boost は 1.42 を使わせて頂いてます。( bind と function ...
--STL は、それぞれのコンパイラの純正付属品です。
で、以下が結果と考察です。
** 結果
|コンテナ|処理|所要時間(ms)|>|>|h
|~|~|vs2005sp|vs2008sp1|vs2010|h
|vector|Vector_For |1129 |8746 |310 |
|~|Vector_For2 |642 |7334 |312 |
|~|Vector_StdBind2nd |307 |913 |307 |
|~|Vector_BoostBind |306 |1267 |308 |
|~|Vector_Tr1Bind |- |914 |307 |
|~|Vector_BoostBind_FuncPtr |901 |3243 |1051 |
|~|Vector_Tr1Bind_FuncPtr |- |1653 |1059 |
|~|Vector_BoostFunction_StdBind2nd |1016 |3938 |1229 |
|~|Vector_Tr1Function_StdBind2nd |- |2460 |1137 |
|~|Vector_BoostFunction_BoostBind_FuncPtr |1523 |6344 |...
|~|Vector_Tr1Function_Tr1Bind_FuncPtr |- |3586 |1764 |
|list|List_StdBind2nd |1793 |4145 |1790 |
|~|List_BoostBind |1787 |4060 |1787 |
|~|List_Tr1Bind |- |3429 |1790 |
*** コード
#region(コード)
#prettify{{
__declspec(dllexport) int WINAPI Vector_For(const std::ve...
{
for(std::vector<int>::const_iterator i=p->begin(); i!=p-...
if( *i > n ){
return *i;
}
}
return p->front();
}
__declspec(dllexport) int WINAPI Vector_For2(const std::v...
{
const std::vector<int>::const_iterator iEnd = p->end();
for(std::vector<int>::const_iterator i=p->begin(); i!=iE...
if( *i > n ){
return *i;
}
}
return p->front();
}
__declspec(dllexport) int WINAPI Vector_StdBind2nd(const ...
{
return *std::find_if(p->begin(), p->end(), std::bind2nd(...
}
__declspec(dllexport) int WINAPI Vector_BoostBind(const s...
{
return *std::find_if(p->begin(), p->end(), boost::bind(s...
}
__declspec(dllexport) int WINAPI Vector_BoostBind_FuncPtr...
{
struct F
{
inline static bool f(const int &a,const int &b)
{
return a > b;
}
};
return *std::find_if(p->begin(), p->end(), boost::bind(&...
}
__declspec(dllexport) int WINAPI Vector_BoostFunction_Std...
{
return *std::find_if(p->begin(), p->end(),
boost::function<bool (const int&)>(std::bind2nd(std::gr...
}
__declspec(dllexport) int WINAPI Vector_BoostFunction_Boo...
{
struct F
{
inline static bool f(const int &a,const int &b)
{
return a > b;
}
};
return *std::find_if(p->begin(), p->end(),
boost::function<bool (const int&)>(boost::bind(&F::f,_1...
}
__declspec(dllexport) int WINAPI Vector_Tr1Bind(const std...
{
#if _MSC_VER < 1500
return p->front();
#else
return *std::find_if(p->begin(), p->end(), std::tr1::bin...
#endif
}
__declspec(dllexport) int WINAPI Vector_Tr1Bind_FuncPtr(c...
{
#if _MSC_VER < 1500
return p->front();
#else
struct F
{
inline static bool f(const int &a,const int &b)
{
return a > b;
}
};
return *std::find_if(p->begin(), p->end(), std::tr1::bin...
#endif
}
__declspec(dllexport) int WINAPI Vector_Tr1Function_StdBi...
{
#if _MSC_VER < 1500
return p->front();
#else
return *std::find_if(p->begin(), p->end(),
std::tr1::function<bool (const int&)>(std::bind2nd(std:...
#endif
}
__declspec(dllexport) int WINAPI Vector_Tr1Function_Tr1Bi...
{
#if _MSC_VER < 1500
return p->front();
#else
struct F
{
inline static bool f(const int &a,const int &b)
{
return a > b;
}
};
return *std::find_if(p->begin(), p->end(),
std::tr1::function<bool (const int&)>(std::tr1::bind(&F...
#endif
}
__declspec(dllexport) int WINAPI List_StdBind2nd(const st...
{
return *std::find_if(p->begin(), p->end(), std::bind2nd(...
}
__declspec(dllexport) int WINAPI List_BoostBind(const std...
{
return *std::find_if(p->begin(), p->end(), boost::bind(s...
}
__declspec(dllexport) int WINAPI List_Tr1Bind(const std::...
{
#if _MSC_VER < 1500
return p->front();
#else
return *std::find_if(p->begin(), p->end(), std::tr1::bin...
#endif
}
}}
#endregion
** 考察
-vs2005 2008 2010 をざっくりと比較すると、vs2005 ≒ vs2010...
-tr1 と boost の比較では、tr1 のほうが早いみたいです。vs2...
-vs2008sp1 は、最適化オプションの「インライン関数の展開」...
-bind は、関数ポインタを渡すより、関数オブジェクトを渡し...
#prettify{{
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::great...
}
}}
-ind2nd(bind1st) と bind を比較すると、vs2005 と vs2010 ...
-for 文の最適化は、vs2010 が良いみたいです。vs2005 と vs2...
#prettify{{
void func(const std::vector<int> &v)
{
for(std::vector<int>::const_iterator i=v.begin(); i!=v.e...
const std::vector<int>::const_iterator e = v.end();
for(std::vector<int>::const_iterator i=v.begin(); i!=e; ...
}
}}
-function をかますとやっぱり遅くなるようです。
** というわけで、まとめとして
案の定、VisualStudio2008 の吐き出すコードは遅いという感じ...
その点、vs2010 は優秀っぽいです。モノによっては 2005 に負...
vs2010 は、開発環境としては、重いし、画面崩れまくるし(←...
- 最後に補足。
まず、これにつかったベンチマークプログラムが、大量のデー...
最適化オプションやコンパイラの得手不得手、さらには、ベン...
ソース一式を添付しますので、もしミスなどあれば是非ともご...
&ref(BenchContain);
よろしく御願いいたします。
終了行:
コーディング小手先テクニックとは多少毛色が違うかもですが...
ちょっと面白い結果だったので、記載してみます。
std::vector (と、ついでに std::list ) を、上からなめるコ...
VisualStudio2005sp1 2008sp1 2010 の3種類で比較です。
各コンパイラの条件はすべて同じハズで、
-最適化オプションは
---実行速度優先(/O2)
---インライン関数の展開(/Ob2)
---組み込み関数を使用する(/Oi)
--_SECURE_SCL はデフォルト(有効)です。
--ヘタに最適化されないように、処理はDLLに逃がしてあります。
--boost は 1.42 を使わせて頂いてます。( bind と function ...
--STL は、それぞれのコンパイラの純正付属品です。
で、以下が結果と考察です。
** 結果
|コンテナ|処理|所要時間(ms)|>|>|h
|~|~|vs2005sp|vs2008sp1|vs2010|h
|vector|Vector_For |1129 |8746 |310 |
|~|Vector_For2 |642 |7334 |312 |
|~|Vector_StdBind2nd |307 |913 |307 |
|~|Vector_BoostBind |306 |1267 |308 |
|~|Vector_Tr1Bind |- |914 |307 |
|~|Vector_BoostBind_FuncPtr |901 |3243 |1051 |
|~|Vector_Tr1Bind_FuncPtr |- |1653 |1059 |
|~|Vector_BoostFunction_StdBind2nd |1016 |3938 |1229 |
|~|Vector_Tr1Function_StdBind2nd |- |2460 |1137 |
|~|Vector_BoostFunction_BoostBind_FuncPtr |1523 |6344 |...
|~|Vector_Tr1Function_Tr1Bind_FuncPtr |- |3586 |1764 |
|list|List_StdBind2nd |1793 |4145 |1790 |
|~|List_BoostBind |1787 |4060 |1787 |
|~|List_Tr1Bind |- |3429 |1790 |
*** コード
#region(コード)
#prettify{{
__declspec(dllexport) int WINAPI Vector_For(const std::ve...
{
for(std::vector<int>::const_iterator i=p->begin(); i!=p-...
if( *i > n ){
return *i;
}
}
return p->front();
}
__declspec(dllexport) int WINAPI Vector_For2(const std::v...
{
const std::vector<int>::const_iterator iEnd = p->end();
for(std::vector<int>::const_iterator i=p->begin(); i!=iE...
if( *i > n ){
return *i;
}
}
return p->front();
}
__declspec(dllexport) int WINAPI Vector_StdBind2nd(const ...
{
return *std::find_if(p->begin(), p->end(), std::bind2nd(...
}
__declspec(dllexport) int WINAPI Vector_BoostBind(const s...
{
return *std::find_if(p->begin(), p->end(), boost::bind(s...
}
__declspec(dllexport) int WINAPI Vector_BoostBind_FuncPtr...
{
struct F
{
inline static bool f(const int &a,const int &b)
{
return a > b;
}
};
return *std::find_if(p->begin(), p->end(), boost::bind(&...
}
__declspec(dllexport) int WINAPI Vector_BoostFunction_Std...
{
return *std::find_if(p->begin(), p->end(),
boost::function<bool (const int&)>(std::bind2nd(std::gr...
}
__declspec(dllexport) int WINAPI Vector_BoostFunction_Boo...
{
struct F
{
inline static bool f(const int &a,const int &b)
{
return a > b;
}
};
return *std::find_if(p->begin(), p->end(),
boost::function<bool (const int&)>(boost::bind(&F::f,_1...
}
__declspec(dllexport) int WINAPI Vector_Tr1Bind(const std...
{
#if _MSC_VER < 1500
return p->front();
#else
return *std::find_if(p->begin(), p->end(), std::tr1::bin...
#endif
}
__declspec(dllexport) int WINAPI Vector_Tr1Bind_FuncPtr(c...
{
#if _MSC_VER < 1500
return p->front();
#else
struct F
{
inline static bool f(const int &a,const int &b)
{
return a > b;
}
};
return *std::find_if(p->begin(), p->end(), std::tr1::bin...
#endif
}
__declspec(dllexport) int WINAPI Vector_Tr1Function_StdBi...
{
#if _MSC_VER < 1500
return p->front();
#else
return *std::find_if(p->begin(), p->end(),
std::tr1::function<bool (const int&)>(std::bind2nd(std:...
#endif
}
__declspec(dllexport) int WINAPI Vector_Tr1Function_Tr1Bi...
{
#if _MSC_VER < 1500
return p->front();
#else
struct F
{
inline static bool f(const int &a,const int &b)
{
return a > b;
}
};
return *std::find_if(p->begin(), p->end(),
std::tr1::function<bool (const int&)>(std::tr1::bind(&F...
#endif
}
__declspec(dllexport) int WINAPI List_StdBind2nd(const st...
{
return *std::find_if(p->begin(), p->end(), std::bind2nd(...
}
__declspec(dllexport) int WINAPI List_BoostBind(const std...
{
return *std::find_if(p->begin(), p->end(), boost::bind(s...
}
__declspec(dllexport) int WINAPI List_Tr1Bind(const std::...
{
#if _MSC_VER < 1500
return p->front();
#else
return *std::find_if(p->begin(), p->end(), std::tr1::bin...
#endif
}
}}
#endregion
** 考察
-vs2005 2008 2010 をざっくりと比較すると、vs2005 ≒ vs2010...
-tr1 と boost の比較では、tr1 のほうが早いみたいです。vs2...
-vs2008sp1 は、最適化オプションの「インライン関数の展開」...
-bind は、関数ポインタを渡すより、関数オブジェクトを渡し...
#prettify{{
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::great...
}
}}
-ind2nd(bind1st) と bind を比較すると、vs2005 と vs2010 ...
-for 文の最適化は、vs2010 が良いみたいです。vs2005 と vs2...
#prettify{{
void func(const std::vector<int> &v)
{
for(std::vector<int>::const_iterator i=v.begin(); i!=v.e...
const std::vector<int>::const_iterator e = v.end();
for(std::vector<int>::const_iterator i=v.begin(); i!=e; ...
}
}}
-function をかますとやっぱり遅くなるようです。
** というわけで、まとめとして
案の定、VisualStudio2008 の吐き出すコードは遅いという感じ...
その点、vs2010 は優秀っぽいです。モノによっては 2005 に負...
vs2010 は、開発環境としては、重いし、画面崩れまくるし(←...
- 最後に補足。
まず、これにつかったベンチマークプログラムが、大量のデー...
最適化オプションやコンパイラの得手不得手、さらには、ベン...
ソース一式を添付しますので、もしミスなどあれば是非ともご...
&ref(BenchContain);
よろしく御願いいたします。
ページ名: