演算子オーバーロードの速度

ちょっと気になったので、演算子オーバーロードを実装したクラスでの演算と、普通の変数での演算速度にどれくらい違いがあるのか計ってみた。

予想では、演算子オーバーロードしたほうは、少なくとも関数呼び出しのオーバーヘッドで遅くなるだろうと思うけど・・・

一応クラスのほうのコード

class S_Float
{
public :
float value;
S_Float& operator=(float val)
{
value = val;
return *this;
}

operator float() const
{
return value;
}
float operator+(float val)
{
return value+val;
}
float operator-(float val)
{
return value-val;
}

float operator+=(float val)
{
value+=val;
return value;
}
float operator-=(float val)
{
value-=val;
return value;
}
};

例によって10,000 * 10,000のループで測定。単位はミリ秒。
オーバーフローすると極端に速度が落ちるので、足して引いて値が変わらないようにする。

最適化無効

float S_Float int
815 1,618 556

最大限最適化

float S_Float int
778 771 42

最適化した場合の値は相変わらず疑わしいけど・・・
試しに1,000*1,000ループにしたらちゃんと1/100の値になったし、一応信じよう。

floatよりS_Floatの方が微妙に速いのは誤差だとして、値をそのまま返す場合は全く同じになるんだね。
関数呼び出しのオーバーヘッドも無い。優秀だなぁ。

intが最適化で速くなりすぎてるのは何故なんだぜ?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

認証のために問題を解いて下さい * Time limit is exhausted. Please reload CAPTCHA.