linux - perf stat 为每次运行提供不同数量的指令

标签 linux computer-architecture perf

我对以下空程序进行了性能分析,

#include <stdio.h>
int main() {
}

编译并运行 perf stat ./a.out 后,我​​得到以下输出(以及其他数据,如周期数、任务时钟等):

418,869 instructions # 0.87 insns per cycle

在同一 Sprite 的每次“性能”分析期间,指令数量都会发生变化。

我的实际需要是查找我编写的特定函数中的指令数。所以我将从新程序中的指令数中减去上述数字。(我可以计算在 gcc 中使用 -S 标记创建的 program.s 中的行数,但在查看 perf 行为后我感到困惑)

为什么指令条数不一致,准确的说是不一样?

更新 我遵循了 man page 中给出的示例在 C 中使用 perf_event_open()

最佳答案

为了测量函数执行的指令数,我建议使用 perf_event_open() 开始和停止事件计数在函数的进入和退出处,而不是在有和没有函数的情况下运行你的程序两次。

关于空程序执行的指令数的不确定性,您可能正在计算用户和内核领域的事件。我认为用户空间计数在两次运行之间应该保持不变,但是对于内核部分,执行该程序的幕后发生了很多事情,所以我猜不确定性来自内核代码中发生的事情。要仅计算用户空间指令,您可以使用:

perf stat -e instructions:u a.out

您能否提供更多有关差异的详细信息?

关于linux - perf stat 为每次运行提供不同数量的指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26312127/

相关文章:

java - 当使用 StandardOpenOption.SYNC 打开底层 channel 时,我们是否必须刷新 MappedByteBuffer

windows - 内存和磁盘有哪些不同的区域?

linker - Perf中用于确定库加载地址的机制

computer-architecture - gem5 缓存统计 - 重置和转储

profiling - 使用性能工具测量挂钟时间的最佳事件计数器

macos - 在 Mac 上安装 "perf"

json - 使用 jq 更新 JSON 文件时缺少内容

linux - 如何以编程方式发送空白密码?

python - 在新的 Python 源安装上运行 get-pip 后 undefined symbol

c - 二进制数表示