当前位置:  开发笔记 > 人工智能 > 正文

Delphi分析工具

如何解决《Delphi分析工具》经验,为你挑选了4个好方法。

我的Delphi 2006应用程序遇到了一些性能问题.你能建议任何有助于我找到瓶颈的分析工具吗?

即像turbo Profiler这样的工具



1> lkessler..:

不久前我问了同样的问题

我已经下载并尝试了AQtime.它看起来似乎很全面,但它不是一个易于使用的工具,对于个别程序员来说非常昂贵(即600美元).我喜欢这样的事实:它是非侵入性的(没有改变你的代码),并且它可以进行逐行分析,直到我发现因为它是一个仪器分析器,它可能导致不正确的优化,如:为什么CharInSet比Case语句更快?

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

多年来我一直使用GpProfile和Delphi 4.我爱它.它也是侵入性的,但它工作得很好,我学会了相信它,它从未在10年内给我一个问题.但是当我升级到Delphi 2009时,我认为最好不要尝试使用它,因为它没有升级并且GP的承认,如果没有修改就无法工作.我希望你无法在Delphi 2006中使用它.

ProDelphi和GpProfile只会在程序级别进行分析.如果你想做单独的线路(我有时必须这样做),你必须为每条线路调用PROC1,PROC2,PROC3并在每个PROC中放置一条线路.这样做有点烦人,但它给了我很好的结果(至少我很满意GpProfile的结果).

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

顺便说一句,你最好不要购买AQtime来节省你的600美元,而是使用它来将你的Delphi 2006升级到Delphi 2009.稳定性,速度和额外功能(特别是Unicode)将是值得的.请参阅:升级到D2009的主要动机是什么(不包括Unicode)?

此外,AQtime尚未整合到Delphi 2009中.

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


注意:我之后添加到问题291631的Addenum 似乎可能是答案.请参阅Andre的开源程序:asmprofiler


2010年2月跟进.我咬了一口子并购买了AQTime.几个月前,他们最终将它集成到我使用的Delphi 2009中(但他们仍然需要使用Delphi 2010).查看源代码行及其各自的时间和数量对我来说是非常宝贵的,而AQTime在这方面做得非常出色.



2> Charles Faig..:

我刚刚找到了一个非常好的免费 采样分析器,它支持Delphi 2009



3> 小智..:

我使用过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上卖了.



4> Sean..:

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

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有