私はこの事故に気づき、広範囲にテストすることにしました。なぜconst intはconst intより高速ですか?
#define Type int
#define Prm const Type &
Type testfunc1(Prm v1, Prm v2, Prm v3, Prm v4, Prm v5, Prm v6, Prm v7, Prm v8, Prm v9, Prm v10){
return (v1|v2|v3|v4|v5|v6|v7|v8|v9|v10);
}
億回:私は関数を呼び出すとき
ので、種類int
、const int
とconst int &
で
for(Type y = 0; y < 10000; y++){
for(Type x = 0; x < 10000; x++){
out |= testfunc1(x,y,x,x,y,y,x,y,x,y);
}
}
は、私はconst int
がconst int &
よりも高速であることに気づきます。 (注:戻り値を使用して関数が最適化されないようにする)
なぜそうですか?私はいつも&
を追加すると実際には速くなると思っていましたが、テストではそれとは逆のことが言えます。より大きなデータ型の場合は、結果が異なる可能性があることを知っています。結果についてはかなり確信しているので、テストしませんでした。
私のテスト:
const int: 7.95s
const int &: 10.2s
編集:私はそれが原因で私のアーキテクチャで確かだと思います。私はSint64
タイプでテストし、その結果は以下の通りであった。
const Sint64: 17.5s
const Sint64 &: 16.2s
EDIT2:それともそれはありますか? double
タイプ(?64ビットである)でテストされ、結果は私が困惑します:
const double: 11.28s
const double &: 12.34s
EDIT3:64ビットタイプで、私の最新のテストを一致させるためにループコードを更新しました。
戻り値を使用しても、最適化されないことはありません。つまり、コンパイル時に計算全体を行うことができるため、コンパイラはすべてを最適化してループを単に「0x3FFF」に置き換えることができます。 –
私はこれに対する答えに興味があるでしょう。 const intは、const int&よりも関数プロローグコード(コンパイラによって入れられる)によって異なって扱われるかもしれません。私は教育的な推測をしています。 – octopusgrabbus
@ R.MartinhoFernandes、もしそれが最適化されていれば、7.95秒間それを実行しません;)私のコンパイラはそれほどスマートではないことは言うまでもありません(パラメータの定数を与えた場合にのみ最適化できました) 。 – Rookie