try 〜 throw 〜 catch の乱用を避けるべし |
通説ですが、try〜throw〜catch は遅いです。 |
List1 |
class CTest { public: enum{ TABLESIZE = 100, }; int m_Table[TABLESIZE]; public: CTest(); int CaseGoto(); int CaseTry(); virtual void OnExcept(){} }; CTest::CTest() { ::memset(m_Table,0,sizeof(m_Table)); m_Table[0] = 1; } int CTest::CaseGoto() { int nCount = 0; for(int i=0; i<1000000; i++ ){ for(int x=0; x<TABLESIZE; x++ ){ if( m_Table[x] != 0 ){ OnExcept(); // 最適化されないように念のため goto next; // throwと比較しやすいようにgoto使ってます } } nCount++; next:; } return nCount; } int CTest::CaseTry() { int nCount = 0; for(int i=0; i<1000000; i++ ){ try{ for(int x=0; x<TABLESIZE; x++ ){ if( m_Table[x] != 0 ){ OnExcept(); // 最適化されないように念のため throw false; } } nCount++; }catch(...){ } } return nCount; } |
CTest::CaseGoto と CTest::CaseTry の処理時間をそれぞれ計測してみると、 |
前のページ 最適化オプション"エイリアスを使わないと仮定する"の意味を熟考すべし |
コンテンツのトップ |
次のページ ビットフィールドを活用すべし(メモリ節約編) |