測試環境:Visual Studio 2008 SP1
測試對象:RTTI的dynamic_cast和自己實現的RTTI系統,代碼如下
template<typename TClass>
TClass* Cast( )
{return IsKindOf( TClass::StaticGetClassInfo() ) ? (TClass*)this:null;
}
bool RTTIObject::IsKindOf( RTTIClass* ClassInfo ) {RTTIClass* ThisClass = GetRTTIClass();
if ( ThisClass == null )
return false;
return ThisClass->IsKindOf( ClassInfo );}
bool RTTIClass::IsKindOf( RTTIClass* ClassInfo ) { RTTIClass* ThisClass = this;while ( ThisClass != null )
{ if ( ClassInfo == ThisClass )return true;
ThisClass = ThisClass->mParentClass;
}
return false;
}
測試代碼:
class ClassA : public RTTIObject
{public:DECLARE_RTTI_CLASS( ClassA )
int a;private:};
IMPLEMENT_RTTIROOT( ClassA )
class ClassB: public ClassA
{DECLARE_RTTI_CLASS( ClassB )
public:int b;private:};
IMPLEMENT_RTTI_CLASS( ClassB, ClassA )
class ClassC : public ClassB
{DECLARE_RTTI_CLASS( ClassC )
public:int c;private:};
IMPLEMENT_RTTI_CLASS( ClassC, ClassB )
class ClassD: public ClassA
{DECLARE_RTTI_CLASS( ClassD )
public:int d;private:};
ClassC c;
ClassD d;
ClassA* fakeC = &c;
ClassA* fakeD = &d;
const int TestTimes = 10000;
float t1 = TimeSource::GetAppTime();for ( int i = 0;i<TestTimes;i++)
{ClassC* realC = dynamic_cast<ClassC*>(fakeC);
ClassD* realD = dynamic_cast<ClassD*>(fakeD);
}
float t2 = TimeSource::GetAppTime() - t1;for ( int i = 0;i<TestTimes;i++)
{ClassC* realC = fakeC->Cast<ClassC>( );
ClassD* realD = fakeD->Cast<ClassD>( );
}
float t3 = TimeSource::GetAppTime() - t2;SimpleLog log;
log.Debug(L"%f %f", t2, t3);
| 10000次,單位:毫秒 | dynamic_cast | Cast |
| Debug | 1.468590 | 5.173067 |
| Release | 1.025950 | 0.702404 |
可以看得出來,沒有優化過的Cast代碼性能極差,但是優化過的Cast性能超越了系統的dynamic_cast,跟蹤匯編發現系統有做個一些異常及bad_cast的處理
建議:可以做一個宏,在不支持RTTI的編譯器及平臺下使用自己的Cast


