【问题标题】:Delphi Profiling tools [closed]Delphi 分析工具 [关闭]
【发布时间】:2010-09-27 00:06:32
【问题描述】:

我的 Delphi 2006 应用程序存在一些性能问题。 你能建议任何分析工具来帮助我找到瓶颈

即turbo Profiler 之类的工具

【问题讨论】:

标签: delphi performance profiling


【解决方案1】:

不久前我问过同样的question

我已经下载并试用了 AQtime。它看起来确实很全面,但它不是一个易于使用的工具,而且对于单个程序员来说非常昂贵(即 600 美元)。我喜欢它是非侵入性的(没有更改您的代码),并且它可以进行逐行分析,直到我发现因为它是一个检测分析器,它可能导致不正确的优化,如下所示: Why is CharInSet faster than Case statement?

我尝试了 ProDelphi 的演示,价格便宜得多(我认为大约 80 美元),但它对我来说太笨重了 - 我根本不喜欢用户界面,而且它是侵入性的 - 更改代码以添加仪表,你必须小心。

我多年来一直使用 GpProfile 和 Delphi 4。我爱它。它也是侵入性的,但它运作良好,我学会了信任它,而且它在 10 年内从未给我带来任何问题。但是当我升级到 Delphi 2009 时,我认为最好不要尝试使用它,因为它还没有升级,而且 GP 承认,不修改就无法工作。我预计您将无法在 Delphi 2006 中使用它。

ProDelphi 和 GpProfile 只会在过程级别进行分析。如果你想做单独的行(我有时不得不这样做),你必须为每一行调用 PROC1、PROC2、PROC3 并将一行放在每个 PROC 中。不得不这样做有点烦人,但它给了我很好的结果(至少我对 GpProfile 这样做的结果感到满意)。

我在 CharInSet 问题中接受的答案是:“定期检查 CPU 位置的采样分析器通常更适合测量代码时间。”后来answer 给了Eric Grange 的Delphi 免费采样分析器,现在支持Delphi 2009。我还没有尝试过,但我听说过它的好消息,这是我要尝试的下一个.

顺便说一句,您最好不要购买 AQtime,而是使用它来将您的 Delphi 2006 升级到 Delphi 2009,从而节省 600 美元。稳定性、速度和额外功能(尤其是 Unicode)值得您购买尽管。见:What are major incentives to upgrade to D2009 (Unicode excluded)?

AQtime 还没有集成到 Delphi 2009 中。

另一个免费的,我发现但尚未尝试的来源是TProfiler。如果有人尝试过,我想知道他们的想法。


注意:我后来添加到question 291631 的附录似乎是答案。见Andre's open source program: asmprofiler


2010 年 2 月的后续行动。我硬着头皮买了AQTime。几个月前,他们终于将它集成到我使用的 Delphi 2009 中(但他们仍然必须使用 Delphi 2010)。查看源代码行及其各个时间和计数对我来说非常宝贵,而 AQTime 在这方面做得非常出色。

【讨论】:

  • 我很确定 AQTime 6 将与 Delphi 2009 集成。
  • 截至 2008 年 12 月 15 日,它没有。当我无法让我的试用版下载集成时,我与 AutomatedQA 进行了沟通,他们说他们仍在努力。 AQTime 6.10 只能与 Delphi 2009 作为一个单独的程序一起使用。
  • AQTime 6.30 于 2009 年 11 月发布,并最终添加了与 Delphi 2009 的集成。当然,Delphi 2010 已经发布,不,AQTime 还没有集成。或许 D2010 人还要再等一年。
【解决方案2】:

我刚刚找到了一个非常不错的免费sampling profiler,它支持Delphi 2009

【讨论】:

  • 也适用于 delphi 7 - 感谢这个。注意,确保在链接器选项中启用 TD32 调试信息。
【解决方案3】:

我使用过 ProDelphi,主要用于确定哪些例程消耗的时间最多。它是一个 Instrumenting Profiler,这意味着它会在每个例程的开头和结尾添加一些代码。您可以通过 cmets 中的指令控制它配置的例程。您还可以分析例程的各个部分。但是这些部分必须在同一块级别开始和停止,没有进入或退出该部分。优化必须在 ProDelphi 插入它的代码的地方(你放置指令的地方)关闭,但你可以在其他任何地方打开它。

界面有点笨拙,但一旦掌握了它就会非常快。您可以使用免费版本(限于 10 个例程或部分)进行有用的工作。 ProDelphi 可以快速告诉您应该检查哪些例程。但不是为什么,或者是哪几行。

最近,我开始使用英特尔的 VTune 性能分析器。 “哇”并没有开始总结它。我印象深刻。我根本不知道所有这些都内置在现代英特尔处理器中。您是否知道它可以准确地告诉您在从更高的缓存重新加载一个字之前,一条指令需要多长时间等待 L1 数据缓存侧向查看另一个内核?如果我继续写下去,我听起来就像是一个令人窒息的产品广告。

访问英特尔并下载完整的定时演示。在网上挖掘并找到一些关于如何开始的视频。 (否则,您将面临被所有选项所阻碍的风险。)它适用于任何编译器。只需将其指向 .exe。如果您的 .exe 包含调试信息并且您将其指向源代码,它将显示源代码行。


我一直在尝试优化调用我编写的函数的内部循环。除了长度(str)之外,没有外部调用。这个内部循环每次运行数十亿次,消耗了大约一半的 CPU 时间——这是优化的完美候选者。我尝试了各种标准优化,几乎没有效果。 VTune 显示热点。我只是深入研究,直到它向我展示了我的代码生成的 ASM,以及每条指令花费了多少时间。

这是 VTune 告诉我的:

  • line nnnn [delphi 代码行] ...
  • addr hhhh cmp byte ptr [edx+ecx],0x14h - - - - - - - - 3 个周期
  • addr hhhh ja label_x - - - - - - - - - - - - - - - - -10302 个周期

绝对值没有任何意义。 (我想我是在测量每条退役指令的周期。)相对值很清楚所有时间都去了哪里。最棒的是建议窗口。它告诉我代码停止等待数据加载到 L1 数据缓存中,实际上给了我关于如何避免停止的很好的建议。

我的错误在于认为 Core2 Quad 只是一个非常快的 8086 CPU。没有^3。代码花费了 99% 的时间来等待从内存中加载数据,因为我跳得太快了。我的算法假设内存是 RAM(随机存取)。这不是现代 CPU 的工作方式。 L1 缓存中的数据可能会在 1 或 2 个周期内被访问,但访问 L2 或 L3 缓存需要数十到数百个周期,而进入 RAM 则需要数千个周期。 但是,当您按顺序访问数据时,所有延迟都可以避免 - 因为处理器会在您请求的第一个字节之后使用数据预加载缓存。

最终结果是我重写了算法以更顺序地访问数据,并获得了 10 倍的加速,这已经足够了。当我有时间时,我确信我可以再获得 10 倍的收益。但这只是我心中的极客。足够好就足够了。

我已经知道,通过优化算法而不是代码,您可以获得最大的收益。我以为我只需要探查器告诉我需要优化什么。但我也需要它来找出瓶颈的原因,这样我就可以设计一个更快的算法。

新算法与旧算法没有根本不同。它只是存储数据,以便可以按顺序访问。例如,在一个地方,我将一个字段从记录数组移动到它自己的整数数组中——因为内部循环不需要每条记录中的其余数据。我还有一个矩形矩阵存储为动态数组的动态数组。代码使用它来随机访问兆字节的数据(而糟糕的 L1 数据缓存只有 64Kb)。我想出了如何将它作为矩阵的对角线存储在线性数组中,这是我使用数据的顺序。 (好吧,也许那部分激进的。)

无论如何,我在 VTune 上被卖掉了。

【讨论】:

    【解决方案4】:

    我过去曾在 Delphi 7 项目中成功使用过http://www.prodelphi.de。便宜又好用。不要让丛林联盟网站吓跑你。

    【讨论】:

      【解决方案5】:

      www.AutomatedQA.com 是 Delphi profiling (AQTime) 的最佳选择

      【讨论】:

      • 请注意,AQA 是基于检测而不是分析,因此它会给非常细粒度的瓶颈提供误导性结果。
      • s/不分析/不采样/
      【解决方案6】:

      我使用并推荐 Sampling Profiler,我想你可以从 embarcadeiro.public,attachments 新闻组获得它。

      【讨论】:

      【解决方案7】:

      这里还有一个选择,这个我没用过:http://www.prodelphi.de

      【讨论】:

        【解决方案8】:

        我所知道的 Delphi 的最终选择,http://gp.17slon.com/gpprofile/index.htm

        【讨论】:

          【解决方案9】:

          最后一点,www.torry.net 是 Delphi 组件/工具搜索的好地方

          【讨论】:

          • Darian,不要为一个问题添加 4 个答案,而是编辑您的第一个答案以提供所有信息,然后删除其他 3 个。
          猜你喜欢
          • 2010-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-08
          • 2023-03-14
          • 1970-01-01
          • 2011-01-05
          相关资源
          最近更新 更多