为啥用 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 测量一个周期时,时间间隔比一个周期大?的主要内容,如果未能解决你的问题,请参考以下文章

在 UILocalNotification 中创建周间隔以及周期

读 perf 笔记 简写

为啥 perf 无法收集任何样本?

多周期路径检查时为啥hold的设置比setup要

为啥CPU工作需要时钟呀?时钟是如何控制CPU工作的?

使用 linux perf 工具测量应用程序的 FLOP