performance - perf 记录(或其他分析器)如何选择将哪条指令计为成本时间?
问题描述
最近,我发现实际上 perf(或 pprof)可能会在反汇编视图中显示实际上没有花费这个时间的行附近的指令时序。真正花费了这段时间的指令在它之前。我知道一个模糊的解释是,这是由于 CPU 中的指令流水线而发生的。但是,我想了解以下内容:
- 这种效果有更详细的解释吗?
- 它记录在 perf 或 pprof 中吗?我没有找到任何参考资料。
- 有没有办法获得正确放置的时间?
解决方案
(快速而不是超级详细的答案;如果有人想写一个更详细的答案会很好)。
perf
只需使用 CPU 自己的硬件性能计数器,当计数器倒计时到零或达到阈值时,它们可以进入记录事件的模式。
引发中断或将事件写入内存中的缓冲区(使用 PEBS 精确事件)。该事件将包括 CPU 选择与事件相关联的代码地址(即引发中断的点),即使对于像cycles
不像instructions
固有的特定指令相关联的事件。当计数器换行时,乱序的 exec 后端可以有几百条指令在运行,但必须为任何给定的样本选择一个。
通常,CPU“责备”正在等待产生缓慢结果的指令,而不是产生它的指令,尤其是缓存未命中负载。
有关 Intel x86 CPU 的示例,请参阅为什么在执行指针追踪时这条跳转指令如此昂贵? 这似乎也取决于在引发中断时让 ROB 中的最后一条指令退出的效果。(英特尔 CPU 至少似乎确实做到了这一点;即使指令可能很慢,也能确保向前推进。)
一般来说,当指责后面的指令而不是实际花费时间的指令时,可能会出现“偏差”,可能有不同的原因。(也许特别是对于非核心事件,因为它们与核心时钟异步发生。)
其他相关问答与有趣的例子或其他事情
推荐阅读
- php - php 是否可以使用表单 action = $_SERVER['PHP_SELF'] 发布重定向获取
- spring - 如何使用 permitAll 允许公开访问 Spring Security 应用程序的某些部分?
- php - MySQL如何从复选框列表中选择一个选项
- r - 无法从 shinyapps.io 连接到 Microsoft Azure
- javascript - 云功能停止执行
- python - 如何替换整个 csv 文件中的特定单词?
- javascript - 如何在运行时导入/需要远程脚本而不将节点附加到 DOM
- java - 不兼容的类型。必需:android.content.Context 找到:java.lang.String
- plot - 八度中旅行推销员的情节线
- powerbi - Power BI DAX 将值拆分为多个范围