分析说明

时间:2009-07-12 15:16:25

标签: c++ profiling instructions

我想在我的代码中计算几个cpu指令。例如我想知道有多少次添加,多少次乘法,多少次浮点运算,我的代码执行了多少个分支。我目前在Linux下使用gprof来分析我的c ++代码,但它只给出了对我的函数的调用次数,并且我手动估计了指令的数量。是否有任何工具可以帮助我?也许是一些虚拟机?

6 个答案:

答案 0 :(得分:5)

如果你真的需要计算指令,那么你可能最好生成汇编程序,然后将输出传递给智能grep等价物。对于gcc,请尝试-S切换。

答案 1 :(得分:4)

这是一般性建议,而非特定于Linux:您应该对CPU周期感兴趣。忘记指令的数量作为衡量性能的指标。一条指令可能与其他10条指令的成本相同,因此它不会告诉您任何内容。

在线程进入休眠状态(“切换/切换”)时,您应该关注CPU周期和多线程环境(大多数情况下,如今不是全部),这样可以让您知道等待多长时间用于完成I / O,DB等,它会影响CPU特权时间。

答案 2 :(得分:2)

您可以使用ValgrindCallgrind --dump-instr=yes标记来实现此目标

答案 3 :(得分:1)

对于Linux用户来说,Intels vtune是免费的,AFAIK(假设我们正在讨论基于intel的x86 linux机器)。它将为您提供所需的所有信息和SOOO。

答案 4 :(得分:0)

出于好奇,指令计数是分析代码性能的有用方法吗?

我知道在“简单”CPU设计的时代,你可以合理地假设每个操作码都需要花费那么多纳秒的CPU时间来执行,但是现在所有复杂的内存缓存方案都在-the-fly操作码重新排序,流水线操作,超标量体系结构以及其他所有被抛入现代CPU的内容,操作码执行的简单计数是否仍能很好地指示代码运行需要多长时间?或者执行时间是否会根据(例如)内存访问模式和执行操作码的顺序而变化,因为它将在操作码执行的原始频率上执行?

我怀疑现在可靠地预测代码性能的唯一方法是实际运行目标体系结构上的代码并计时....即,通常当编译器发出低效的代码时,它实际上正在做聪明的东西利用了现代CPU架构的一个微妙特征。

答案 5 :(得分:0)

您可以使用pin-instat这是PIN工具。要使用它,您需要安装PIN。但是,单独的指令数量并不能说明性能。缓存未命中,分支预测也发挥了重要作用。

免责声明:我是pin-instat的作者。