基准测试- CPU时间大于墙钟时间?

9

我在Linux上测量排序算法的CPU时间和墙钟时间。我使用getrusage来测量CPU时间,使用clock_gettime CLOCK_MONOTONIC获取墙钟时间。虽然我注意到CPU时间比墙钟时间长 - 这是正确的吗?我一直认为CPU时间必须小于墙钟时间。我的示例结果:

3.000187 seconds  [CPU]
3.000001 seconds  [WALL]

涉及多少个处理器? - Dan Pichelman
@DanPichelman:cat /proc/cpuinfo | grep processor | wc -l 告诉我有 2 个处理器。 - mazix
但是你的代码是多线程/多进程的吗? - Oliver Charlesworth
@OliCharlesworth:即使它不是多线程的,也只有轻微的过剩,可能是由于系统操作是多线程的而被收费。 - Eric Postpischil
@OliCharlesworth:不,这只是一个带有一些函数/计时器调用的主函数。 - mazix
2个回答

15

如果一项计算需要两秒的处理器时间,那么两个处理器可以在一秒钟内(理论上)完成它。因此,一个双处理器系统每秒钟有两个 CPU 秒。即使你的进程没有明确使用多线程,你所使用的库或操作系统可能会使用多个处理器来为你的进程执行工作。

此外,一些计算是近似的。系统可能会以一些小单位(比如微秒)来跟踪处理器时间,并且每当进程获得至少半个微秒的处理器时间时,就会向进程收取一个微秒的费用。(这应该是给所有回答浮点数问题建议使用整数算术以避免舍入误差的人一个教训。所有离散算术都可能存在舍入误差。)


1
根据使用的参数不同,getrusage 可能会返回进程中所有线程的 CPU 时间总和。如果您有多个线程,则这可能导致 CPU 时间高于墙钟时间。
此外,尽管结果结构以微秒为单位存储值,但实际精度可能要低得多,因此存在小差异。

我这样使用它:getrusage(RUSAGE_SELF, &rus),并且只有一个线程:(int main(){//...}) - mazix
那可能是由于 getrusage 的精度有限。您可以尝试多次运行程序以查看两个值的变化情况。 - Benawii

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