如何解释clock()函数?

4
在我的C++程序中,我通过clock()命令来测量CPU时间。由于代码在不同计算机集群上执行(运行相同的操作系统,但具有不同的硬件配置,即不同的CPU),因此我想了解如何测量实际执行时间。我的情况如下:
据我所知,clock()给出自某个固定日期以来经过的CPU时钟滴答数。我通过再次调用clock()并计算差值来测量相对持续时间。
现在什么定义了C++中的内部clock()?如果我有1.0 GHz和2.0 GHz的两个CPU A和B,并在它们上面运行相同的代码,CPU A和B将需要多少个时钟才能完成工作? clock()是否对应于“工作完成”?还是真正的“时间”?
编辑:由于未设置CLOCKS_PER_SEC,因此我无法将时钟转换为秒的运行时间。正如手册所说,CLOCKS_PER_SEC取决于硬件/架构。这意味着时钟依赖于硬件。因此,我确实需要知道clock()给我什么,没有任何额外的计算。
3个回答

3
clock()函数应返回尽可能接近CPU使用时间的表示,而不考虑CPU的时钟速度。 CPU时钟速度可能会干扰(但不一定),在粒度方面; 但更常见的是,时钟的粒度取决于某些外部时间源。(在遥远的过去,它通常基于电力线频率,粒度为1/50或1/60秒,具体取决于您所在的位置。)
要以秒为单位获取时间,请除以CLOCKS_PER_SEC。 但请注意,clock()CLOCKS_PER_SEC都是整数值,因此除法是整数。 在执行除法之前,您可能需要将其中一个转换为double。 在过去,CLOCKS_PER_SEC也对应于粒度,但现代系统似乎只选择一些大值(Posix要求1000000,无论粒度如何); 这意味着clock()连续返回值将“跳跃”。
最后,值得注意的是,在VC ++中,clock()已损坏,并返回墙上的时间,而不是CPU时间。 (这可能是历史条件; 在早期,墙上的时间是唯一可用的时间,Microsoft的人们可能认为有依赖它的代码。)

谢谢。这个回答接近了解我的问题。我对clock()函数的硬件方面更感兴趣 - 因为我的clock()调用在不同的计算机上给出了不同的结果,实际上它们应该给出大致相同的数字,对吗?而且,“clock()函数应该返回最接近CPU使用时间的表示,而不管CPU的时钟速度”意味着更快的CPU会给出较小的时钟数,对吗? - mad
@mad 是的。程序运行得越快,两次调用 clock() 的差异就越小。当然,假设差异足够大以至于具有显著性(这取决于分辨率)。 - James Kanze
在VC++中,clock()函数存在问题,它返回的是墙上挂钟时间,而不是CPU时间。哦,天啊。我不知道这一点,但我应该猜到了... - Lightness Races in Orbit

2

你可以通过将时钟滴答数除以CLOCKS_PER_SEC来将其转换为实际时间。

请注意,自C++11以来,更适合测量经过时间的方法是使用std::steady_clock


小心术语的使用;它仍然不是“实时”的,而是以熟悉的单位表示的CPU时间。相反,我认为std::steady_clock是一个实时时钟(尽管单调),因此不能替代clock(),后者不测量“经过的时间”。 - Lightness Races in Orbit

0

来自man clock

返回的值是已使用的 CPU 时间,类型为 clock_t;要获取使用的秒数,请除以 CLOCKS_PER_SEC。如果无法获得所使用的处理器时间或其值无法表示,则该函数返回值 (clock_t) -1。


1
当然,在这方面,VC++的实现是有问题的,因为它返回挂钟时间。 - James Kanze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接