为什么“ setne%al”在性能注释中使用“很多周期”?

问题描述

当我看到这个性能报告时,我非常困惑。我已经试了好几次了,这个setne指令总是在函数中发挥最大作用。该功能是一个大功能,下面仅显示该功能的一小部分。

该报告的产生依据:

perf record ./test

然后我用以下方法检查性能结果:

perf report --showcpuutilization

我为大多数成本函数之一打开了批注,该批注非常大,图中小块所示:

enter image description here

从中,我们可以看到 setne 指令(从顶部开始的第10行,用红色显示)命中率约为9%。

有人会帮助我,因为我不明白为什么这个“简单的指令”要花费这么多时间?也许与流水线排序有关,而流水线排序又依赖于其他指令?预先感谢!

顺便说一句:该程序是在x86_64体系结构上使用以下命令编译的:

gcc -g -pg -m32 -o test test.c

下面是CPU信息:

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 63
model name      : Intel(R) Xeon(R) CPU E5-2680 v3 @ 2.50GHz
stepping        : 2
microcode       : 0x1
cpu MHz         : 2494.222
cache size      : 16384 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm invpcid_single ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat md_clear spec_ctrl intel_stibp
bogomips        : 4988.44
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical,48 bits virtual
power management:

解决方法

只是想在这里提供一个不准确的答案:

  • “perf”基于示例工作。在每个样本中,它检查当前 EIP 值并记录。
  • 指令的百分比仅指 EIP 显示地址时的样本与示波器的总样本相比。当前一条指令很慢时,EIP 就停留在这里。
  • 对于一些现代 CPU,有时报告的热点可能是真正“阻塞点”之前的几条指令。所以通常是 很高兴回头看看是否有任何说明可能会导致 延迟执行。

参考文献:https://perf.wiki.kernel.org/index.php/Tutorial#Sampling_with_perf_record

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...