c++ - 斐波那契世代的渐近和实际运行时间中的常数与系统因素
问题描述
我实现了一个简单的 DP 方法来计算理论上在线性时间内运行的斐波那契数:
vector<ull> fib_iter(int len) {
vector<ull> fibs = {0, 1};
for (int i = 2; i < len; ++i){
fibs.push_back(fibs[i-1]+fibs[i-2]);
}
return fibs;
}
使用chrono
库对其进行计时时,计算前 10 个需要 12.8 微秒,前 100 个需要 18.8 微秒,前 1000 个需要 63.3。我的问题是为什么这些都不比最后一个大 10 倍。这不可能是因为恒定因素,因为它们是固定的,所以一定是因为系统优化。是编译器内联、缓存、一些架构怪癖,还是就系统细节而言究竟是什么?当我递归地实现这个算法或使用矩阵求幂时,我们看不到 10 倍的跳跃,这也是同样的原因吗?
解决方案
推荐阅读
- elixir - `Ecto.Schema.Metadata` 的目的是什么?(即,`__meta__` 字段)
- node.js - 如何在 tensorflow.js 中构建和训练序列 2 序列模型
- indexing - Xcode 10 索引问题,可能是新构建系统引起的
- stm32 - 在 stm32f446 中,如果有 8 个独立的 DMA 通道可用,那么如何同时运行 8 个 DMA?
- java - 如何用杰克逊反序列化匿名抽象类?
- html - Bootstrap 悬停和切换折叠菜单在 Rails 应用程序中不起作用
- html - 如何在草图软件上发送 whatsapp 图像?未共享
- android - Bootstrap 下拉菜单在 Android 上不起作用
- javascript - Hapi.js websocket协议通信需要客户端使用hapi.js连接websocket吗?
- c# - Windows 窗体上的登录错误。(视觉工作室)