关于一般的“as-if”规则有一个很大的问题,但我想知道在测量时间方面是否有任何例外。
考虑一下(取自此处稍作修改):
using std::chrono;
auto begin = steady_clock::now();
auto result = some_lengthy_calculation(some_params);
auto end = std::chrono::steady_clock::now();
std::cout << "Time diff = " << duration_cast<microseconds>(end - begin).count() <<std::endl;
std::cout << "Result = " << result;
允许编译器应用任何产生相同结果的优化result
。这里的重点是“as-if”规则并不直接适用于测量时间。当然,在应用优化时,测量的时间不应该是恒定的。
所以我的问题是:当根据“as-if”规则允许编译器将其重新排列为以下之一时,我怎么可能用上面的代码可靠地测量时间?
auto temp = some_lengthy_calculation(some_params); // clever "optimization", precompute some stuff
auto begin = steady_clock::now();
auto result = temp; // yay, I can use it here to pretend to be faster
auto end = steady_clock::now();
std::cout << "Time diff = " << duration_cast<microseconds>(end - begin).count() <<std::endl;
std::cout << "Result = " << result;
甚至“更优化”:
std::cout << "Time diff = " << 42 <<std::endl;
std::cout << "Result = " << some_lengthy_calculation(some_params);
我假设没有理智的编译器会这样做,但是究竟是什么阻止了编译器进行这种“优化”呢?
TL;博士...
- 可以观察优化代码和非优化代码之间的运行时差异
- 如果允许编译器优化影响测量时间,是什么阻止编译器根本不为计时创建任何代码?