在Mac OS X上进行C++性能分析

83

我正在尝试在我的Mac(OS X Lion)上对一些C++代码进行性能分析,目前还没有找到有用的工具。我需要一个能够告诉我哪些函数占用了CPU时间的分析器(类似于Matlab分析器)。

我已经尝试过以下工具:

  • gprof。这是我在Linux机器上使用的工具,但在我的Mac上只会输出空内容(显然是一个已知的问题)。
  • Instruments。我无法弄清如何在编译后的二进制文件中进行性能分析,也找不到任何有用的教程。
  • 其他搜索结果提到的Shark已经不再可用,而Valgrind则只能做内存分析。

你可以尝试这个,因为这些原因 - Mike Dunlavey
1
MikeDunlavey的评论间接建议您在gdb(或其他调试器,如果您能弄清楚如何)中打开程序,并定期手动中断它,基本上模拟gprof / Instruments为您执行的操作,但需要更多的精神压力。只需使用Instruments即可;有关逐步说明,请参见下面@duskwuff的答案。 - Quuxplusone
@Quuxplusone:我的间接建议可以找到gprof/Instruments无法找到的加速机会。Instruments会对调用栈进行采样,但据我所知,它不允许您实际检查单个堆栈样本,这是您找到加速的方法。相反(除非我错了),它认同“热路径”的概念,在任何体量较大的非玩具程序中,重大问题很容易隐藏在热路径之外。 - Mike Dunlavey
@Quuxplusone:以下是如何构建热路径。获取所有通过main(100%)的样本。其中,找到从main调用最多的例程(称其为A),并假设它占样本的30%。其他函数可能在剩余的70%中,但每个函数被调用的次数都少于A。在这些样本中,找到从A调用最多的例程(称其为B),并假设它占这些样本的30%。因此,序列main-A-B占样本的30%乘以30%= 9%。除了那9%之外的任何内容都不会被注意到。您可以发现,在几个级别之后,有很多东西是看不见的。 - Mike Dunlavey
BSD中的iprofiler非常好用,因为它的输出可以在Instruments中打开。 - Entalpi
3个回答

125
仪器是使用的工具。仪器的完整解释超出了此答案的范围,但这里是一个快速入门指南:
  1. 打开Instruments。1
  2. 选择“时间分析器”模板。
  3. 在“目标”下拉菜单中选择您的应用程序。2
  4. 点击红色圆形(“录制”)按钮以启动应用程序运行。
  5. 如果适用,请在应用程序中执行需要分析的操作。
  6. 再次点击记录按钮以停止记录。
  7. 使用Instruments中的工具分析您的结果。

可用的工具中,最常用的工具是:

  • 使用披露箭头展开调用树
  • 单击函数名称旁边的带圈箭头进行聚焦
  • 双击函数以查看相关源代码
  • 左侧的“Invert Call Tree”复选框

您还可以在命令行上启动instruments的调用:

instruments -l 30000 -t Time\ Profiler -p 5773

请查看说明


1 打开Instruments的一种简单方法是使用Spotlight:只需点击任务栏右上角(时钟旁边)的放大镜,然后键入“Instruments”。

2 点击“选择目标...”,然后导航到可执行文件的路径。


嗨@duskwuff,那正是我一直在做的事情,但我的堆栈跟踪为空。完全没有任何东西。我的应用程序是一个命令行工具,应该在大约30秒后终止,但Instruments仍在继续。此外,我似乎找不到任何命令行输出(虽然这并非必要,但这将是我的程序正在运行的一个很好的指示)。 - foges
3
我刚学到了 iprofiler 命令行工具可以收集跟踪信息,并且这些信息可以在 Instruments 应用程序中查看。由于 man -k profiler 没有包含它在结果中,因此很难发现它的存在。 - Kurtis Rader
2
这也可以从命令行中使用,如 instruments。例如,instruments -t "Time Profiler" ./a.out foo.txt 20 — 这比在 GUI 中设置参数和工作目录更容易。之后,生成的 instrumentscli0.trace 可以通过 Instruments GUI 打开,甚至可以通过命令行打开 GUI:open -a Instruments instrumentscli0.trace - ShreevatsaR
3
你好,我来自2022年。我正在运行macOS 12.1操作系统,无法找到命令行程序"instruments"。请问你知道苹果将它移到哪里了吗? - vy32
1
@PatKilg:我认为@vy2正在寻找上面提到的instruments命令行工具(我也在寻找它,但迄今没有成功)。 - Paul R
显示剩余3条评论

9
仪器确实是正确的答案,但如果你不知道如何使用它,另一个选择是在内置的活动监视器应用程序中使用分析器。在活动监视器中,您可以获取有关任何正在运行的进程的信息,并有一个按钮以样本执行一段时间。您需要启动程序,切换到活动监视器,查找进程,然后对其进行取样。
此外,您可以通过在调试器中运行程序并手动暂停它半打左右,并在这些时间记录调用堆栈来执行“穷人级的剖析”。这非常简单,但作为大多数程序的第一步,效果惊人。
还有一个命令行 sample 程序,它像其他程序一样对调用堆栈进行采样。

9

工具是解决问题的关键。 为了避免空白痕迹的问题,请确保从XCode中打开工具:

Xcode > Open Developer Tool > Instruments

如果您使用上一个版本的XCode之前固定在dock中的旧Instruments图标打开Instruments,它将给您空白的跟踪结果。


1
确实。这解决了我遇到的空白调用树问题。谢谢! - bsumirak
3
现在似乎只有这种方式可以启动Instruments(除了命令行)。 最近的操作系统升级后,在Spotlight中找不到它。 不确定什么时候发生了这种变化。 - Bryn Keller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接