我正在尝试选择一个性能分析器来使用。我是一名初学者,不知道在性能分析器中寻找什么。最重要的特点是什么?
7 回答
If you use valgrind
, I can highly recommend KCacheGrind to visualize performance bottlenecks.
我想在探查器中显示以下功能/输出信息。1.) 应该能够显示消耗的总时钟周期以及每个功能。
2.) 如果不是一个,应该说明每个函数所消耗的总时间和花费的时间。
3.)它应该能够告诉一个函数被调用了多少次。
4.) 很高兴知道内存读取、内存写入、缓存未命中、缓存命中。
5.) 每个功能的代码记忆
6.) 使用的数据内存:全局常量、堆栈、堆使用。
=广告
- Stability - be able to profile your process for long durations without crashing or running out of memory. its surprising how many commercial profilers fail that.
我的偏好是采样分析器而不是检测分析器。探查器应该能够将示例数据映射回源代码,最好是在 GUI 中。我知道的两个最好的例子是:
- Mac OS X:Shark developer.apple.com
- Linux:缩放www.rotateright.com
Goldenmean 说得对,我要补充一点,行执行计数有时也很方便。
您只需要一个带有“暂停”按钮的调试器或 IDE。它不仅是最简单、最便宜的工具,而且根据我的经验,它是最好的。这是一个完整的解释为什么。注意倒数第二条评论。
编辑,因为我想到了一个更好的答案:
顺便说一句,我在 70 年代学习 AI,一个非常流行的想法是自动编程,很多人都试图实现它。(我对它进行了尝试。)这个想法是尝试使具有领域知识结构以及所需功能要求的过程自动化,以生成(和调试)一个可以满足这些要求的程序。这将是关于编程领域的自动推理的一次巡回演出。有一些诱人的演示,但在实际意义上,该领域并没有走得太远。尽管如此,它确实为编程语言贡献了很多想法,比如合约和逻辑验证技术。
为了构建一个理想的分析器,为了优化程序,它会每纳秒获取一个程序状态的样本。无论是在运行中还是稍后(理想,记得吗?)它都会仔细检查每个样本,看看在知道程序执行的原因后,特定纳秒的工作是否实际上是必要的,或者可以以某种方式消除。
这将是数十亿个样本和大量推理,但当然会有大量重复,因为任何浪费成本,比如 10% 的时间,在 10% 的样本上都会很明显。这种浪费可以在不到 10 亿个样本中识别出来。如果事实上,100 个甚至更少的样本可以发现它,只要它们是在时间上随机选择的,或者至少在用户关心的时间间隔内。这是假设目的是找到浪费,以便我们可以摆脱它,而不是非常精确地测量它。
为什么将所有推理能力应用于每个样本会有帮助?好吧,如果程序很小,而且它只是在寻找诸如 O(n^2) 代码之类的东西,那应该不会太难。但是假设程序的状态由一个 20-30 层深的过程堆栈组成,可能不止一次出现一些递归函数调用,可能有一些函数调用外部处理器来执行 IO,可能程序的操作是由表中的一些数据驱动。然后,要确定特定样本是否浪费,需要潜在地检查所有或至少部分状态信息,并使用推理能力来查看它是否真的有必要完成功能要求。
探查器正在寻找的是由于可疑原因而花费的纳秒。要了解它被使用的原因,需要检查堆栈上的每个函数调用站点,以及围绕它的代码,或者至少是其中一些站点。花费纳秒的必要性需要在堆栈上执行的每条语句的必要性的逻辑与。它只需要一个这样的函数调用站点对整个样本有一个可疑的理由 有一个可疑的理由。因此,如果整个目的是找出因可疑原因花费的纳秒,那么样本越复杂越好,每个样本的推理能力越强越好。(这就是为什么更大的程序有更多的加速空间——它们有更深的堆栈,因此有更多的调用,因此更有可能出现不合理的调用。)
好吧,那是未来。但是,由于我们不需要大量样本(10 或 20 个非常有用),并且我们已经拥有高度智能的自动编程器(由比萨饼和苏打水驱动),我们现在可以做到这一点。
将其与我们今天称为分析器的工具进行比较。他们中的佼佼者会采集堆栈样本,但他们的输出是什么?测量。“热门路径”。鼠窝图。秀色可餐。从中,即使是人工智能程序员也很容易错过很大的低效率,除了那些输出暴露的那些。 在你修复了你确实找到的那些之后,你没有找到的那些才是最重要的。
学习人工智能学到的一件事是,如果人类原则上做不到,不要指望能够对计算机进行编程来做某事。