为了分析执行时间的某些属性,我打算在程序的单独执行中同时使用Perf和PIN来获取我的所有信息。PIN 会给我指令混音,Perf 会给我这些混音的硬件性能。作为健全性检查,我分析了以下命令行参数:
g++ hello_world.cpp -o hello
所以我完整的命令行输入如下:
perf stat -e cycles -e instructions g++ hello_world.cpp -o hello
pin -t icount.so -- g++ hello_world.cpp -o hello
在 PIN 命令中,为了这篇文章,我忽略了文件的所有路径内容。icount.so
此外,除了默认的动态指令计数之外,我还更改了基本指令以记录指令混合。结果惊人地不同
PIN Results:
Count 1180608
14->COND_BR: 295371
49->UNCOND_BR: 21869
//skipping all of the other instruction types for now
Perf Results:
20,538,346 branches
105,662,160 instructions # 0.00 insns per cycle
0.072352035 seconds time elapsed
这应该通过具有大致相同的指令数和大致相同的分支分布来作为完整性检查。 为什么动态指令计数会减少x100倍?! 我期待一些噪音,但这有点多。
此外,Perf 的分支数量为 20%,但 PIN 报告约为 25%(这似乎也有一点差异,但这可能只是大量指令计数失真的副作用)。