为啥用 perf 测量一个周期时,时间间隔比一个周期大?
Posted
技术标签:
【中文标题】为啥用 perf 测量一个周期时,时间间隔比一个周期大?【英文标题】:Why is there a time gap bigger than a cycle when measuring a cycle with perf?为什么用 perf 测量一个周期时,时间间隔比一个周期大? 【发布时间】:2016-08-03 22:00:39 【问题描述】:我使用命令perf record -a
测量我系统上的性能计数器并使用perf script
获取结果,如下所示
[000] 109528.087598: 1 cycles
[000] 109528.100038: 5072 cycles
[000] 109528.120034: 4878 cycles
[000] 109528.144032: 4514 cycles
假设我在 3.3GHz CPU 上运行它。从公式CPU freq = number of cycles / time
我们得到,在一微秒内我们有 3.3 * 10^3 个周期。
我的问题是,为什么测量一个周期平均需要 3.95 微秒,而从公式来看,它显然应该更少?
【问题讨论】:
我第一个直观的想法是,这种情况是由于CPU在开始执行另一个函数之前进行了其他操作(因此使用循环),但我不确定这是否是真正的原因。跨度>Perf record
进行采样 - 这意味着 perf 每秒将产生大约 1000 - 4000 个中断,并且为了获得它们,它将设置性能计数器以适应一定数量的周期。性能记录(或性能报告/性能脚本)也可能隐藏命中空闲进程的样本。要获取 cpu 时钟周期数,请使用 perf stat
工具,该工具将使用 PMU 的计数模式。
【参考方案1】:
perf record
进行采样 - 这意味着 perf 每秒将产生大约 1000 - 4000 个中断,并且为了获得它们,它将设置性能计数器以适应一定数量的周期(中断之间可能不同)。它只记录到perf.data
接收到中断时以及此刻的指令地址。 perf report
将以“样本”为单位报告,而不是精确的刻度。
性能记录(或性能报告/性能脚本)也可能隐藏命中空闲进程的样本。
要获取周期数,请使用perf stat
/ perf stat -a
工具,该工具将使用 PMU 的计数模式。此模式还会为您进行频率计算并打印 CPU 的平均有效频率。
【讨论】:
以上是关于为啥用 perf 测量一个周期时,时间间隔比一个周期大?的主要内容,如果未能解决你的问题,请参考以下文章