我的Delphi 2006应用程序遇到了一些性能问题。 你能建议任何有助于我找到瓶颈的分析工具
即。像turbo Profiler这样的工具
答案 0 :(得分:24)
我不久前问了同样的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节省你的600美元,而是用它来将你的Delphi 2006升级到Delphi 2009.稳定性,速度和额外功能(特别是Unicode)值得你的而。请参阅:What are major incentives to upgrade to D2009 (Unicode excluded)?
AQtime还没有整合到Delphi 2009中。
另一个免费的,有我发现但尚未尝试的来源是TProfiler。如果有人试过那个,我想知道他们的想法。
注意:我之后添加到question 291631的Addenum似乎可能就是答案。见Andre's open source program: asmprofiler
2010年2月的后续行动。我咬了一口子并购买了AQTime。几个月前,他们最终将它集成到我使用的Delphi 2009中(但他们仍然需要使用Delphi 2010)。查看源代码行及其各自的时间和数量对我来说是非常宝贵的,而AQTime在这方面做得非常出色。
答案 1 :(得分:11)
我刚刚发现了一个非常好的免费sampling profiler,它支持Delphi 2009
答案 2 :(得分:8)
我使用过ProDelphi,主要是为了确定哪些例程吃的时间最多。它是一个Instrumenting Profiler,这意味着它会在每个例程的开头和结尾添加一些代码。您可以通过注释中的指令控制它所配置的例程。您还可以分析例程的各个部分。但是这些部分必须在相同的块级别开始和停止,没有进入或退出该部分。优化必须在ProDelphi插入代码(放置指令的地方)的地方关闭,但你可以在其他地方打开它。
界面有点笨拙,但是一旦掌握了它就会非常快。您可以使用免费版本(仅限10个例程或部分)执行有用的工作。 ProDelphi可以快速告诉您应该检查哪些例程。但不是为什么,或者是哪条线。
最近,我开始使用英特尔的VTune性能分析器。 'WOW'并未开始总结。我留下深刻印象。我根本不知道所有这些内置于现代英特尔处理器中。您是否知道它可以准确地告诉您在从较高缓存重新加载单词之前,单个指令需要等待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上卖了。
答案 3 :(得分:6)
我过去曾使用http://www.prodelphi.de在Delphi 7项目上取得成功。便宜又有效。不要让丛林联盟的网站吓跑你。
答案 4 :(得分:3)
www.AutomatedQA.com是Delphi分析(AQTime)的最佳选择
答案 5 :(得分:3)
我使用并推荐Sampling Profiler,我想你可以从embarcadero.public,附件新闻组中获取它。
答案 6 :(得分:0)
这是另一种选择,我之前没有使用过这个选项:http://www.prodelphi.de
答案 7 :(得分:0)
我知道Delphi的最终选择,http://gp.17slon.com/gpprofile/index.htm
答案 8 :(得分:-1)
最后说明,www.torry.net是Delphi组件/工具搜索的好地方