2

在我的程序的顶部和末尾,我使用 clock() 来计算我的程序需要多长时间才能完成。不幸的是,它的报告时间似乎只有一半。我用“时间”命令仔细检查了这一点。

我的程序报告:在 45.86 秒内完成

时间命令报告:real 0m22.837s user 0m45.735s sys 0m0.152s

用我的手机计时,它在 23 秒内完成(又名:“真实”时间)。“用户”时间是所有线程的总和,因为我使用的是 OpenMP,所以这很有意义。(你可以在这里阅读:What do 'real', 'user' and 'sys' mean in the output of time(1)?

那么,为什么 clock() 在“用户”时间而不是“实时”时间报告?我应该使用不同的函数来计算我的程序运行了多长时间?

作为旁注,Windows 的时钟()按预期工作并“实时”报告。

4

3 回答 3

6

用户 0m45.735s

clock()根据 7.27.2.1 测量进程使用的 CPU 时间(尽可能好)

自仅与程序调用相关的实现定义时代开始以来,clock 函数返回实现对程序使用的处理器时间的最佳近似值。

而不是挂钟时间。因此,clock()报告的时间接近于正常且符合标准的报告user时间。time

要测量经过的时间,如果您可以假设 POSIX,usingclock_gettime可能是最好的选择,标准函数time()也可以用于此,但不是很细粒度。

于 2012-11-12T20:56:26.153 回答
2

我建议clock_gettime使用CLOCK_MONOTONIC时钟。

根据您的特定系统,这应该提供接近微秒或更好的分辨率,并且如果(例如)有人在您的程序运行时设置系统时间,它不会做有趣的事情。

于 2012-11-12T21:00:18.090 回答
0

我建议在 OpenMP 应用程序中进行基准测试,您可以使用可移植的 OpenMP 计时函数omp_get_wtime(),该函数返回一个double包含自过去某个未指定时间点以来的秒数的值。调用它两次并减去返回值以获得经过的时间。您可以通过调用来了解时间测量的精确度omp_get_wtick()。它返回double计时器分辨率的值 - 更接近的值0.0表示更精确的计时器。

于 2012-11-13T13:05:45.120 回答