ちょっと気になったので、演算子オーバーロードを実装したクラスでの演算と、普通の変数での演算速度にどれくらい違いがあるのか計ってみた。
予想では、演算子オーバーロードしたほうは、少なくとも関数呼び出しのオーバーヘッドで遅くなるだろうと思うけど・・・
一応クラスのほうのコード
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が最適化で速くなりすぎてるのは何故なんだぜ?