我应该检查什么:cpu时间还是墙时间

What should I check: cpu time or wall time?

本文关键字:时间 cpu 检查 什么 我应该      更新时间:2023-10-16

我有两种算法来完成同一任务。要检查它们的性能,我应该检查什么:cpu时间还是墙时间?我认为是cpu时间,对吧?

我正在对代码进行并行处理。要检查并行性能,我应该检查什么:cpu时间还是墙时间?我想现在是墙时间,对吧?

假设我已经使用多线程实现了理想的并行。我认为1个线程的cpu时间将与8个线程相同,1个threas的墙时间将是8个线程的8倍。对吗?

还有什么简单的方法可以检查这些时间吗?

答案取决于您真正想要测量的内容。

如果你有几个小代码序列,每个序列都在一个CPU上运行(即,它基本上是单线程的),并且你想知道哪个更快,你可能需要CPU时间。这将告诉你执行代码所需的时间,而不计算其他事情,如I/O、任务切换、在其他进程上花费的时间、中断处理等。[注意:尽管它试图忽略其他事实,但在系统尽可能静止的情况下,你通常仍能获得最准确的结果。]

如果您正在编写多线程代码,并想衡量代码在处理器/内核之间的分布情况,您可能会同时测量CPU时间和墙时间,并将两者进行比较。例如,如果您有4个可用内核,那么您的理想情况是壁时间是CPU时间的1/4。

所以,对于多线程代码,您通常会在两个阶段完成任务:首先,您要查看在线程上执行的时间,使用CPU时间。你进行优化以使其达到(合理的)最小值。然后在第二阶段,将墙时间与CPU时间进行比较,以尝试有效地使用多个内核。由于更改其中一个通常会影响另一个,因此您很可能会多次迭代这两个(并且经常在某种程度上在两者之间折衷)。

正如真正的一般经验法则一样,您倾向于使用CPU时间来测量单个代码位的微观基准,而使用壁时间来测量更大的(系统级)基准。换句话说,当你想测量一段代码的运行速度,而不想测量其他速度时,CPU时间通常是最有意义的。当您想包括磁盘I/O时间、缓存等因素的影响时,您可能更关心墙时间。

墙时间告诉您的计算机用了多长时间。但它不会告诉你执行代码需要多长时间,因为它取决于其他让你的计算机忙碌的事情。

有不同的机制来测量执行代码所花费的CPU时间-我个人喜欢getrusage()