ある function の 2 つの競合する実装のベンチマークを行いたいとしましょうdouble a(double b, double c)
。入力値を取得できる大きなデータが既にあるarray <double, 1000000> vals
ので、ベンチマークはおおよそ次のようになります。
//start timer here
double r;
for (int i = 0; i < 1000000; i+=2) {
r = a(vals[i], vals[i+1]);
}
//stop timer here
さて、巧妙なコンパイラは、最後の反復の結果しか使用できず、残りを単純に殺して、double r = a(vals[999998], vals[999999])
. もちろん、これはベンチマークの目的に反します。
他のすべての最適化を維持しながら、この種の最適化を防ぐ良い方法 (複数のコンパイラで動作する場合のボーナス ポイント) はありますか?
(空のブロックの挿入に関する他のスレッドを見たことがありますが、インライン化や並べ替えが妨げられるのではないかと心配しています。また、各反復中asm
に結果を追加するという考えは特に好きではありません。これは、sum += r;
結果のタイミング.この質問の目的のために、他の代替ソリューションに焦点を当てることができれば素晴らしいことですが、これに興味のある人にとっては、コメントで活発な議論があり+=
、多くの場合、それが最も適切な方法であるというコンセンサスがあります. . )