【问题标题】:What should I check: cpu time or wall time?我应该检查什么:cpu 时间或墙上时间?
【发布时间】:2013-12-18 15:21:05
【问题描述】:

我有两种算法来完成相同的任务。要检查它们的性能,我应该检查什么:cpu time 或 wall time?我想是cpu时间吧?

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

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

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

【问题讨论】:

  • 这有点宽泛。您能否将问题缩小到您遇到的具体问题?
  • 让我的问题更具体。谢谢。

标签: c++ performance profiling


【解决方案1】:

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

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

如果您正在编写多线程代码并想要衡量您在处理器/内核之间分配代码的效果,您可能需要同时衡量CPU 时间和运行时间,并进行比较他们俩。例如,如果您有 4 个内核可用,那么您的理想情况是挂墙时间是 CPU 时间的 1/4th

因此,对于多线程代码,您通常会分两个阶段执行操作:首先查看线程上执行的时间,使用 CPU 时间。您进行优化以使其达到(合理的)最低限度。然后在第二阶段,您将 wall time 与 CPU time 进行比较,以尝试有效地使用多个内核。由于更改一个经常会影响另一个,因此您可能会多次迭代这两个(并且通常会在某种程度上在两者之间妥协)。

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

【讨论】:

  • 作为磁盘 I/O 和一起缓存的示例——如果你的代码让机器陷入交换文件狂热,那么它的 CPU 时间可能表明它“快”,但你知道(在那些内存中约束)实际上就像墙上时间所说的一样慢。
【解决方案2】:

墙上的时间告诉你你的电脑用了多长时间。但它并没有告诉您您的代码的执行需要多长时间,因为它取决于使您的计算机忙碌的其他因素。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 2013-10-02
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多