C 中经过的时间
Posted
技术标签:
【中文标题】C 中经过的时间【英文标题】:elapsed time in C 【发布时间】:2011-05-30 18:02:05 【问题描述】:#include <time.h>
time_t start,end;
time (&start);
//code here
time (&end);
double dif = difftime (end,start);
printf ("Elasped time is %.2lf seconds.", dif );
我的开始时间和结束时间都是 0.000。我不明白错误的来源。
使用 time(start) 和 time(end) 还是 start=clock() 和 end=clock() 来计算经过的时间更好。
【问题讨论】:
你能发布你正在计时的代码吗?只要您不需要高精度计时,您的计时似乎是正确的。 这对我来说很好。您是否使用调试器验证了 start 和 end 的值? (注意:为了测试它,我在时间(开始)和时间(结束)之间放置了一个“睡眠(1)”。) 如果您需要更高分辨率的时间测量,您是否尝试过clock()
?
@sverre: clock()
不衡量时间的绝对流逝。它衡量专门花费在这一过程上的时间量。重要区别。如果你正在分析,你可能想要这个;否则你可能不会。
【参考方案1】:
在大多数(几乎所有?)系统上,time()
的粒度仅为一秒,因此无法用它测量任何亚秒级的时间长度。如果您使用的是 Unix,请尝试改用 gettimeofday
。
【讨论】:
【参考方案2】:如果您确实想使用 clock()
,请确保您了解它仅测量 CPU 时间。此外,要转换为秒,您需要除以CLOCKS_PER_SEC
。
【讨论】:
【参考方案3】:代码的简短摘录通常不会花费足够长的时间来运行用于分析目的。一种常见的技术是多次(数百万)次重复调用,然后将结果时间增量除以迭代计数。伪代码:
计数 = 10,000,000 开始 = 读取当前时间() 循环计数次数: 我的代码() 结束 = 读取当前时间() elapsedTotal = 结束 - 开始 elapsedForOneIteration = elapsedTotal / 计数如果您想要准确性,可以忽略循环开销。例如:
循环计数次数: 我的代码() 我的代码() 并测量 elapsed1(2 x 计数迭代 + 循环开销) 循环计数次数: 我的代码() 并测量 elapsed2 (计数迭代 + 循环开销) actualElapsed = elapsed1 - elapsed2 (计算迭代次数——因为其余的项被取消了)【讨论】:
【参考方案4】:time
(最多)有第二个分辨率。如果您的代码运行的时间远少于此,您可能不会看到差异。
使用分析器(例如 *nix 上的 gprof,OS X 上的 Instruments;对于 Windows,请参阅“Profiling C code on Windows when using Eclipse”)对代码进行计时。
【讨论】:
【参考方案5】:您在两次测量之间使用的代码运行速度过快。刚试过你的代码打印数字从 0 到 99,999,我得到了
经过的时间是 1.00 秒。
【讨论】:
【参考方案6】:您的代码运行时间不到一秒。
【讨论】:
以上是关于C 中经过的时间的主要内容,如果未能解决你的问题,请参考以下文章