我想测量执行一段代码所需的时间。什么是最有效和正确的方法。
我写了一个类似下面的代码,结果每次都不一样。有一定程度的随机化发生,我不知道为什么以及如何消除这种影响。
#include<stdio.h>
#include<time.h>
int main()
{
int x=10;
int y=25;
int z=x+y;
printf("Sum of x+y = %i", z);
time_t start = clock();
for(int i=0;i<100000;i++)z=x+y;
time_t stop = clock();
printf("\n\nArithmetic instructions take: %d",stop-start);
start = clock();
for(int i=0;i<100000;i++)z=x&y;
stop = clock();
printf("\n\nLogic instructions take: %d",stop-start);
}
结果如下:
Arithmetic instructions take: 327
Logic instructions take: 360
Arithmetic instructions take: 271
Logic instructions take: 271
Arithmetic instructions take: 287
Logic instructions take: 294
Arithmetic instructions take: 279
Logic instructions take: 266
Arithmetic instructions take: 265
Logic instructions take: 296
还有哪些方法可以衡量执行循环所需的时间。
注意:编译器优化不会删除循环,我检查了它。
那么,对一段代码进行基准测试的正确方法是什么?
答案 0 :(得分:1)
您获得的数字表明您在启用优化标志的情况下未编译,这使您的基准测试无效。
例如我编译:
gcc prog.c -Wall -Wextra -O2 -march=native
得到for(long long int i=0;i<10000000000000;i++)
时间0和1。
哪一个获得1?
第一个for循环,无论哪个是(我的意思是&
或+
运算符)。这背后的原因是第一个循环可能在冷启动阶段找到程序,例如缓存。
那么,对一般代码进行基准测试的正确方法是什么?
-O3
)。对于您的特定情况,godbolt完全优化了循环。您没有看到它,因为您没有启用优化标志进行编译。此外,像你这样的测试完全无法测量对C +运算符有用的任何东西,因为它会在同一台机器上的不同上下文中编译成不同的指令。
答案 1 :(得分:0)
时间变化的原因是因为运行程序并不是计算机唯一能做的事情。有几件事可能会导致程序稍长或稍短:
解决方案并不是试图控制所有这些;这不实用。只需运行几百万次基准测试即可平均所有噪音。 (我的经验法则是不断向计数添加零,直到完成至少需要20-30秒,然后运行两次并检查结果大致相同)。这样可以让您清楚地知道通常采取多长时间,如果您还计算方差或标准偏差,您就会知道这些差异与标准差有多大关系。案例分析。