假设我想对某些功能的两个竞争实现进行基准测试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;
在每次迭代期间添加结果的想法,因为这是不应该包含在就这个问题而言,如果我们可以专注于其他替代解决方案,那就太好了,尽管对于对此感兴趣的任何人,评论中都会进行热烈的讨论,其中共识是在许多情况下这+=
是最合适的方法. )