在Delphi的AQTime中,通过使用区域和触发器等可以非常快速地到达故障点。但在我看来,特别是如果您在要分析的区域中有非常多的代码,那么即使没有分析,执行速度也会显著减慢。
例如,如果我想在程序流的后期分析一个特定的例程,但不知道那里调用了什么,我会认为只将此例程作为触发器,并将线程的初始状态设置为Off,然后选择"Full check by Routines/Lines“。然而,当我这样做的时候,在触发器例程被击中之前,程序的执行速度已经大大减慢了。
例如,如果“准备流程”在没有AQTime的情况下花费了大约5分钟,那么当我在禁用分析的情况下运行它时,它已经运行了30分钟,即使我知道还没有达到触发器,它仍然在运行。
我知道我可以尝试通过减少分析的例程/行的数量来解决这个问题,但这对我来说并不是一个好的解决方案,因为一旦我进入实际的触发器例程,我就想分析所有的例程。
另外,通常更好的解决方法是在没有AQTime的情况下启动应用程序,然后在“准备流程”完成后使用Attach to Process,但只有在图形用户界面中的执行在适当的位置暂停,或者为执行附加提供了合适的时间范围时,这种方法才能很好地工作。在所有情况下,情况并非如此。
有任何关于为什么会这样的评论吗?除了尝试减少区域中的代码或稍后附加到过程中之外,还有什么要做的吗?
发布于 2010-04-06 21:30:42
当然,你可以试试我的免费分析器:-)
http://code.google.com/p/asmprofiler/
它同时具有检测和采样分析功能。它不具备AQTime的所有功能,但至少是免费的(如果停止分析,性能损失很小)。
发布于 2010-04-06 21:24:12
AQTime是一个插装分析器。在运行时,它基本上包围了您选择用自己的代码分析的每个方法(或行,这取决于您如何配置选项),有点像这样:
begin
DoStuff();
end;...becomes:
begin
AQTimeEnter('MethodName');
try
DoStuff();
finally
AQTimeLeave('MethodName');
end;
end;它直接在可执行文件中执行此操作,而不是通过修改源代码,但效果基本上是相同的。当分析处于活动状态时,这些调用会有相当大的开销,因为它们会触发相当多的事件,并记录大量信息。
当分析处于非活动状态时,开销较小,因为它们不会记录任何内容。但是,对于方法调用本身,加上try/finally块,仍然有一些开销。
我不知道你是否可以在AQTime中做任何事情来改善这一点,而不是减少配置文件。但是,您也可以尝试使用采样剖析器,它对剖析器本身的开销较小,但可能会错过对快速执行的例程的调用。
发布于 2010-04-06 21:37:25
那么,你所说的“按例程/行进行全面检查”是什么意思?例程和行之间有很大的不同。分析例程应该不会减慢你的应用程序的速度。对我来说不是这样。按行分析可能非常慢,我认为这就是您现在正在做的。
一般来说,我们的想法是首先按例程进行分析,找到瓶颈,然后逐行分析那些(并且只有那些)例程。
https://stackoverflow.com/questions/2584917
复制相似问题