Technical Report 1でC++の標準ライブラリにいくつかのクラスが追加されました。VisualStudioのSP1ではこのTR1が採用され新しいクラスを使うことが可能になりました。
前にCArray、CAtlArray、vector、配列、array(C++/CLI)のパフォーマンス測定ということをやりましたが、今回は、追加されたクラスの内スマートポインタのクラスにあたるshared_ptrについてパフォーマンスを測定してみたいと思います。
パフォーマンス測定
パフォーマンス測定では、RdTscを使って平均的なクロック数を測定する。測定は、Windows XP/Core 2 DuoのPCで行った。shared_ptrに付け加え、自動変数・new/delete・auto_ptr・CAutoPtr・vector<shared_ptr>・CAutoPtrArrayについてCStringのオブジェクトの構築・破棄に対して調査した。
一つのオブジェクトの構築・破棄
1つのオブジェクトを構築しそれを破棄するようなコードの測定。
コード | クロック数 | 速度(%) |
---|---|---|
auto CString() | 85 | 100 |
delete new CString(); | 398 | 21.4 |
CAutoPtr < CString > ( new CString() ); | 399 | 21.4 |
auto_ptr < CString > ( new CString() ); | 399 | 21.3 |
shared_ptr < CString > ( new CString() ); | 914 | 9.3 |
shared_ptr < CString > p1( new CString() ); shared_ptr < CString > p2( p1 ); |
1016 | 8.4 |
shared_ptr < CString > p1( new CString() ); weak_ptr < CString > p2( p1 ); p2.lock(); |
1060 | 8 |
自動変数として使用する場合と比べ、shared_ptrの構築・破棄に10倍以上のクロック数がかかっている。また、CAutoPtrやauto_ptrに比べ2.3倍のクロック数がかかっていることがわかる。
複数のオブジェクトの構築・破棄
5つのオブジェクトを構築しそれをスマートポインタのリストに追加するようなコードの測定。
コード | クロック数 | 速度(%) |
---|---|---|
CString s[ 5 ]; | 498 | 100 |
delete new CString(); delete new CString(); delete new CString(); delete new CString(); delete new CString(); |
1975 | 25.2 |
CAutoPtrArray < CString > a; a.Add( CAutoPtr < CString > ( new CString() ) ); a.Add( CAutoPtr < CString > ( new CString() ) ); a.Add( CAutoPtr < CString > ( new CString() ) ); a.Add( CAutoPtr < CString > ( new CString() ) ); a.Add( CAutoPtr < CString > ( new CString() ) ); |
3173 | 15.7 |
vector < shared_ptr < CString > > v; v.push_back( shared_ptr < CString > ( new CString() ) ); v.push_back( shared_ptr < CString > ( new CString() ) ); v.push_back( shared_ptr < CString > ( new CString() ) ); v.push_back( shared_ptr < CString > ( new CString() ) ); v.push_back( shared_ptr < CString > ( new CString() ) ); |
9382 | 5.3 |
CAutoPtrArrayと比べvetor<shared_ptr>の構築・破棄に約3倍のクロック数がかかていることがわかる。
結果としては、何度も構築・破棄するようなオブジェクトは自動変数で割り当てるのがもっとも速度が早いことがわかる。また、一度しか構築しないものについてはそれぞれクロック数に差はあるものの全般的に大したクロック数ではないので、好きなものを選択するのがよいことがわかる。