【发布时间】:2017-02-17 13:11:30
【问题描述】:
我有一些代码试图确定代码块的执行时间。
#include <time.h>
#include <stdio.h>
int main()
{
clock_t start_t, end_t, total_t;
int i;
start_t = clock(); //clock start
printf("Starting of the program, start_t = %ld\n", start_t);
printf("Going to scan a big loop, start_t = %ld\n", start_t);
for(i=0; i< 10000000; i++) //trying to determine execution time of this block
{
}
end_t = clock(); //clock stopped
printf("End of the big loop, end_t = %ld\n", end_t);
total_t = (long int)(end_t - start_t);
printf("Total time taken by CPU: %lu\n", total_t );
return(0);
}
代码sn-p在我机器上的输出是
Starting of the program, start_t = 8965
Going to scan a big loop, start_t = 8965
End of the big loop, end_t = 27259
Total time taken by CPU: 18294
因此,如果我的 CPU 以 21 MHz 运行并假设这是唯一要执行的事情,则每个机器周期大约等于 47 纳秒,因此 (18294 * 47) = 859818 纳秒。
这是我代码中 for 循环的执行时间吗?我在这里做了一些不正确的假设吗?
【问题讨论】:
-
要获得以秒为单位的时间,您应该除以数字,例如
total_t在你的情况下,CLOCKS_PER_SEC。请注意,您需要将total_t转换为浮点值才能使其工作。 -
对您的命名方案也有一点吹毛求疵:以后缀
_t结尾的符号通常用于类型别名(使用typdef创建)。例如size_t或time_t甚至clock_t。 -
@JoachimPileborg 我查看了 clock() 函数的文档,CLOCK_PER_SEC 将返回精确到 1/100 秒的时间,我正在寻找高达 10 微秒的分辨率,因此我使用了上述方法。另外我希望它可以在不同的平台和架构上工作,所以我认为只计算差异然后将其与时钟速度相乘会是一个更好的选择,因为 CLOCKS_PER_SEC 会随架构而变化。
-
CLOCKS_PER_SEC在不同平台上不同的原因是因为“ticks”是平台相关的。它不仅取决于硬件,还取决于操作系统。您必须在操作系统文档中找到分辨率和精度。可靠且可移植获得秒数的唯一方法是将(浮点)差除以CLOCKS_PER_SEC。否则,这些数字本身毫无意义。 -
您无法真正更改
clock函数或其内部工作方式。但根据操作系统的不同,可能会有更高分辨率的计时器可用。如果你在一个只有最小操作系统的嵌入式系统上,那么硬件可能有你可以使用的计时器。
标签: c time clock system-clock