【发布时间】:2018-09-12 23:21:25
【问题描述】:
我正在尝试在 C++ 上对递归斐波那契序列计算器进行基准测试。但令人惊讶的是程序输出0纳秒,并在打印结果后开始计算。 (打印0纳秒后CPU使用率增加)
我认为这是编译器的优化功能。
#include <iostream>
#include <chrono>
int fib2(int n) {
return (n < 2) ? n : fib2(n - 1) + fib2(n - 2);
}
int main(int argc, char* argv[])
{
auto tbegin = std::chrono::high_resolution_clock::now();
int a = fib2(50);
auto tend = std::chrono::high_resolution_clock::now();
std::cout << (tend - tbegin).count() << " nanoseconds" << std::endl;
std::cout << "fib => " << a << std::endl;
}
输出:
0 nanoseconds
是特色吗?如果是,如何禁用此功能?
【问题讨论】:
-
仅供参考 - 第 50 斐波那契数绝对不适合
int -
首先,正如其他人指出的那样,
int可能不适合fib2(50);,这意味着您可能有signed int溢出,这是未定义的行为,可能导致您的程序执行任何操作。其次,您的结果(如果它适合int)在编译时很容易计算。编译器可以看到a将始终具有相同的值,并且可以在编译时计算它。尝试接受用户输入而不是总是计算第 50 项,然后编译器无法假设结果。最后,您永远不会检查high_resolution_clock::now()返回的类型。验证时钟的rep和period。 -
考虑使用
duration_cast到纳秒以确保计数符合您的预期。 -
我尝试使用 uint 并转换为纳秒,但它在打印 0 纳秒后再次计算。似乎编译器重新排序执行。我也发现了这个:stackoverflow.com/questions/26190364/…
-
@CrazyDeveloper 你用的是什么编译器?你使用什么编译标志?编译器可能被允许相对于其他代码对
now重新排序,但没有合理的实现会允许它。请务必尝试让您的fib2参数依赖于用户输入,以减少优化的可能性。
标签: c++