測試環境: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