我已经开发了一个简单的程序,并希望在真实计算机(例如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基准
长答案:有很多事情会干扰时间安排。
避免这些影响的唯一方法是禁用CPU缩放,执行“缓存刷新”功能(通常在启动前仅触摸大量内存),高优先级运行以及将自己锁定在单个CPU上。即使如此,您的时间安排仍然很嘈杂,所以最后一件事就是重复很多,并使用平均值。
这就是为什么Google基准之类的工具可能是您最好的选择。
来自CPPCon的视频
也可以在线直播
平均不一定是最好的。例如,中值允许整理出绑定的伪像。最低的也要考虑,因为它的干扰较小(即使每次运行之间的可再生性/可比性较低)。
@ Jarod42:github.com/google/benchmark#reporting-statistics。您总是可以争论哪个平均值最好,这主要取决于您使用它的目的。虽然期望变化。几乎无法删除。