実行オーバーヘッド

高速化のため、インライン関数だとかメンバ関数だとかスタティック関数だとかのオーバーヘッドを検証してみた。


class CTest{
public:
long Calc1( long x ){ x=x+1; return x; }
static long Calc2( long );
inline long Calc3( long x ){ x=x+1; return x;}
inline static long Calc4( long );
long* Calc5( long* x ){ *x=*x+1; return x; }
inline long* Calc6( long* x ){ *x=*x+1; return x; }
void Calc7( long* x ){ *x=*x+1; }
};
long CTest::Calc2( long x ){ x=x+1; return x;}
long CTest::Calc4( long x ){ x=x+1; return x;}

これらを1億回呼び出した場合の処理結果。


単純ループ : 265 msec (0.000002 msec/回)
Calc1 : 281 msec (0.000003 msec/回)
Calc2 : 563 msec (0.000005 msec/回)
Calc3 : 281 msec (0.000003 msec/回)
Calc4 : 266 msec (0.000002 msec/回)
Calc5 : 234 msec (0.000002 msec/回)
Calc6 : 219 msec (0.000002 msec/回)
Calc7 : 219 msec (0.000002 msec/回)
結論:
クラススタティック関数が若干重いが、1億回まわしてこの程度の差しかでないので、どれを使っても大差なし*1。それよりも可読性のを重視したほうが良いと思われる。

*1:ただしOSとか基幹部分のコードの場合は「大差」と言えるかも知れない