【发布时间】:2020-05-16 23:29:42
【问题描述】:
我开发了一个简单的程序,并想在真机上评估它的运行时性能,例如我的 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 ms和b ms之间n次。
很明显,实际运行时间变化很大,似乎不是正态分布。有人可以告诉我是什么原因造成的,以及如何正确评估运行时?
感谢您回答这个问题。
【问题讨论】:
-
对不起,我是用g++编译的,不是gcc
-
这在很大程度上取决于您的系统有多忙。我确实希望其他空闲系统的偏差更低。您可以尝试使用
nice -n -10调用该进程以提高调度优先级,看看是否会有所不同。 -
我在本地 (linux) 测试了您的程序,99% 的测试都在 0.5 毫秒的时间间隔内。没有测试超出 10 毫秒的间隔。
-
@Scheff,默认优化级别 (
-O0) for 循环似乎没有优化。 OP 使用默认优化级别。 -
@Scheff 是的,默认优化级别是-O0,for循环没有优化出来。