2008-12-15 240 views
21

我的Delphi 2006应用程序出现一些性能问题。 你可以提出任何分析工具,将帮助我找到瓶颈Delphi分析工具

即像涡轮探查的工具

+0

http://www.prodelphi.de/ – Ampere 2018-02-26 10:33:43

+0

这是免费的,易于使用(与ProDelphi相比)。 delphitools.info/downloads/samplingprofiler-changelog – Ampere 2018-02-26 11:50:57

回答

24

我问了同样的question不久前

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

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

我在Delphi 4中使用了GpProfile多年。我爱它。它也是侵入性的,但它工作得很好,我学会了相信它,它在10年内从未给我带来过问题。但是,当我升级到德尔福2009年时,我认为最好不要尝试使用它,因为它尚未升级,并且由GP承认,如果不进行修改,将无法正常工作。我希望你不能在Delphi 2006中使用它。

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

我在我的CharInSet问题中接受的答案表示:“采样分析器定期检查CPU的位置,通常更适合测量代码时间。”和后来的answer给了Eric的Grange免费的Delphi采样分析器,它现在支持Delphi 2009。我还没有尝试过,但我听说过它的好处,而且它将是我要尝试的下一个。顺便说一句,您可能最好通过不购买AQtime来节省您的600美元,而是使用它来将您的Delphi 2006升级到Delphi 2009。稳定性,速度和额外功能(特别是Unicode)将是值得的你的时间。请参阅:What are major incentives to upgrade to D2009 (Unicode excluded)?

此外,AQtime还未集成到Delphi 2009中。

另一个免费的,有我发现了,但还没有尝试过的来源是TProfiler。如果有人试过那个,我想知道他们在想什么。


注:Addenum后来我加入question 291631好像它可能是答案。见Andre's open source program: asmprofiler


2010年2月跟进。我咬紧牙关,购买了AQTime。几个月前,他们终于把它整合到我使用的Delphi 2009中(但他们仍然需要做Delphi 2010)。查看源代码行以及它们的个人时间和次数对我来说是非常宝贵的,AQTime在这方面做得非常出色。

3

www.AutomatedQA.com已经德尔福分析(AQTime)的最佳选择

+2

请注意,AQA基于仪器而不是分析,因此它会给出非常细粒度瓶颈的误导性结果。 – 2008-12-16 01:54:11

+0

s/not profiling/not sampling/ – 2008-12-16 01:55:15

-1

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

+7

Darian,而不是对一个问题添加4个答案,编辑您的第一个答案以提供所有信息,并删除其他3. – 2008-12-18 06:14:39

5

我已经使用http://www.prodelphi.de在过去的Delphi 7项目上取得成功。便宜和作品。不要让布什联盟网站吓跑你。

3

我使用和推荐Sampling Profiler,我认为你可以从embarcadeiro.public,附件新闻组得到它。

+0

现在它位于http://delphitools.info/上 – 2009-03-21 08:47:34

11

我刚刚发现了一个很不错的免费sampling profiler,它支持Delphi 2009年

8

我用ProDelphi,主要是为了确定哪些程序正在吃饭的时间最多。它是一个Instrumenting Profiler,意味着它在每个程序的开始和结束时添加了一些代码。您可以通过注释中的指令来控制它配置哪些例程。您还可以剖析例程的各个部分。但是这些部分必须在相同的块级开始和停止,不要进入或退出该部分。在ProDelphi插入代码(放置指令的位置)的地方,优化必须关闭,但您可以在任何其他位置打开它。

界面是有点klunky,但非常快,一旦你得到它的窍门。您可以使用免费版本进行有用的工作(限于10个例程或部分)。 ProDelphi可以快速告诉你应该检查哪些例程。但不是为什么,或者哪一行。

最近,我已经开始使用英特尔的VTune性能分析器。 'WOW'并没有开始总结。我留下深刻的印象。我根本不知道这些内置于现代英特尔处理器中。您是否知道它可以准确地告诉您单个指令需要等待L1数据高速缓存在另一个内核中横向查看的频率,然后才能从更高的缓存中重新载入单词?如果我一直在写作,那么听起来就像是产品的广告。

前往英特尔下载全功能定时演示。在网上挖掘并找到一些关于如何开始的视频。 (否则,你会冒着被所有选项阻碍的风险。)它适用于任何编译器。只需将其指向一个.exe即可。它会告诉你源代码行,如果你的.exe包含调试信息&你指向它的源代码。


我被卡在试图优化一个内部循环,调用我写的函数。除了长度(str)以外,没有外部呼叫。这个内部循环每次运行数十亿次,并且耗费大约一半的CPU时间 - 这是优化的最佳选择。我尝试了各种标准优化,几乎没有效果。 VTune显示热点。我只是钻了下去,直到它向我展示了我生成的ASM代码以及每条指令花费了多少时间。

这里就是VTune™可视化告诉我:

  • 线NNNN [Delphi的代码行] ...
  • 地址HHHH CMP字节的ptr [EDX + ECX],0x14h - - - - - - - - 3个周期
  • 地址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出售。