如何评估程序的运行时间?
How to evaluate a program's runtime?
我开发了一个简单的程序,想在真机上评估它的运行时性能,例如我的 MacBook。
源代码去:
#include <stdio.h>
#include <vector>
#include <ctime>
int main () {
auto beg = std::clock () ;
for (int i = 0; i < 1e8; ++ i) {
}
auto end = std::clock () ;
printf ("CPU time used: %lf ms\n", 1000.0*(end-beg)/CLOCKS_PER_SEC) ;
}
它是用 gcc 编译的,优化标志设置为默认值。
在bash脚本的帮助下,我运行它1000次并用我的MacBook记录了运行时间,如下:
[130.000000, 136.000000): 0
[136.000000, 142.000000): 1
[142.000000, 148.000000): 234
[148.000000, 154.000000): 116
[154.000000, 160.000000): 138
[160.000000, 166.000000): 318
[166.000000, 172.000000): 139
[172.000000, 178.000000): 40
[178.000000, 184.000000): 11
[184.000000, 190.000000): 3
"[a,b):n"表示同一个程序的实际运行时间在a毫秒和b毫秒之间n次。
很明显,实际运行时差异很大,似乎不是正态分布。有人能告诉我是什么原因造成的吗?我该如何正确评估运行时?
感谢您回答这个问题。
基准测试很难!
简答:使用google benchmark
长答案:
有很多东西会干扰计时。
- 日程安排(OS运行其他事情代替你)
- CPU 缩放(OS 决定它可以通过 运行 慢速节能)
- 内存争用(其他东西在您需要时使用内存)
- 总线争用(其他设备正在与您想要通话的设备通话)
- 缓存(CPU 保留一个值以避免必须使用内存)
- CPU迁移。 (OS 将您从一个 CPU 转移到另一个)
- 时钟不准确(只有 CPU 时钟在任何程度上都是准确的,但如果您迁移它们会发生变化)
避免这些影响的唯一方法是禁用 CPU 缩放,执行 "cache-flush" 功能(通常只是在启动前接触大量内存), 运行 高优先级,并将自己锁定到一个 CPU。即便如此,你的时间仍然会很嘈杂,所以最后一件事就是简单地重复很多,并使用平均值。
这就是为什么像 google benchmark 这样的工具可能是您最好的选择。
video from CPPCon
也可以直播online
我开发了一个简单的程序,想在真机上评估它的运行时性能,例如我的 MacBook。 源代码去:
#include <stdio.h>
#include <vector>
#include <ctime>
int main () {
auto beg = std::clock () ;
for (int i = 0; i < 1e8; ++ i) {
}
auto end = std::clock () ;
printf ("CPU time used: %lf ms\n", 1000.0*(end-beg)/CLOCKS_PER_SEC) ;
}
它是用 gcc 编译的,优化标志设置为默认值。 在bash脚本的帮助下,我运行它1000次并用我的MacBook记录了运行时间,如下:
[130.000000, 136.000000): 0
[136.000000, 142.000000): 1
[142.000000, 148.000000): 234
[148.000000, 154.000000): 116
[154.000000, 160.000000): 138
[160.000000, 166.000000): 318
[166.000000, 172.000000): 139
[172.000000, 178.000000): 40
[178.000000, 184.000000): 11
[184.000000, 190.000000): 3
"[a,b):n"表示同一个程序的实际运行时间在a毫秒和b毫秒之间n次。
很明显,实际运行时差异很大,似乎不是正态分布。有人能告诉我是什么原因造成的吗?我该如何正确评估运行时?
感谢您回答这个问题。
基准测试很难!
简答:使用google benchmark
长答案: 有很多东西会干扰计时。
- 日程安排(OS运行其他事情代替你)
- CPU 缩放(OS 决定它可以通过 运行 慢速节能)
- 内存争用(其他东西在您需要时使用内存)
- 总线争用(其他设备正在与您想要通话的设备通话)
- 缓存(CPU 保留一个值以避免必须使用内存)
- CPU迁移。 (OS 将您从一个 CPU 转移到另一个)
- 时钟不准确(只有 CPU 时钟在任何程度上都是准确的,但如果您迁移它们会发生变化)
避免这些影响的唯一方法是禁用 CPU 缩放,执行 "cache-flush" 功能(通常只是在启动前接触大量内存), 运行 高优先级,并将自己锁定到一个 CPU。即便如此,你的时间仍然会很嘈杂,所以最后一件事就是简单地重复很多,并使用平均值。
这就是为什么像 google benchmark 这样的工具可能是您最好的选择。
video from CPPCon
也可以直播online