首页 > 解决方案 > perf 记录(或其他分析器)如何选择将哪条指令计为成本时间?

问题描述

最近,我发现实际上 perf(或 pprof)可能会在反汇编视图中显示实际上没有花费这个时间的行附近的指令时序。真正花费了这段时间的指令在它之前。我知道一个模糊的解释是,这是由于 CPU 中的指令流水线而发生的。但是,我想了解以下内容:

  1. 这种效果有更详细的解释吗?
  2. 它记录在 perf 或 pprof 中吗?我没有找到任何参考资料。
  3. 有没有办法获得正确放置的时间?

标签: performanceassemblycpu-architectureperf

解决方案


(快速而不是超级详细的答案;如果有人想写一个更详细的答案会很好)。

perf只需使用 CPU 自己的硬件性能计数器,当计数器倒计时到零或达到阈值时,它们可以进入记录事件的模式。

引发中断或将事件写入内存中的缓冲区(使用 PEBS 精确事件)。该事件将包括 CPU 选择与事件相关联的代码地址(即引发中断的点),即使对于像cycles不像instructions固有的特定指令相关联的事件。当计数器换行时,乱序的 exec 后端可以有几百条指令在运行,但必须为任何给定的样本选择一个。

通常,CPU“责备”正在等待产生缓慢结果的指令,而不是产生它的指令,尤其是缓存未命中负载。

有关 Intel x86 CPU 的示例,请参阅为什么在执行指针追踪时这条跳转指令如此昂贵? 这似乎也取决于在引发中断时让 ROB 中的最后一条指令退出的效果。(英特尔 CPU 至少似乎确实做到了这一点;即使指令可能很慢,也能确保向前推进。)

一般来说,当指责后面的指令而不是实际花费时间的指令时,可能会出现“偏差”,可能有不同的原因。(也许特别是对于非核心事件,因为它们与核心时钟异步发生。)

其他相关问答与有趣的例子或其他事情


推荐阅读