我最近从Delphi 4升级到Delphi 2009.使用Delphi 4,我一直使用Primoz Gabrijelcic的GpProfile作为分析器,使用Turbo Power的Memory Sleuth进行内存分析和泄漏调试.两者都适合我.但我现在需要能够与Delphi 2009配合使用的新工具.
对于Delphi的分析/分析工具的领导者显然是AutomatedQA的AQTime.他们最近甚至吞噬了Atanas Soyanov的Memproof,据我所知这是一款出色的免费记忆分析工具,并将其功能融入AQTime.但AQTime对于个人程序员来说非常昂贵.它实际上比升级到Delphi 2009成本更高!
所以我的问题是:是否还有其他较便宜的选项可以在当前版本的Delphi中进行性能分析和内存分析,您对此感到满意并推荐,或者我应该咬紧牙关并为AQTime付出巨额代价?
Addenum:似乎早期的回答者表明已经包含在Delphi中的FastMM管理器非常适合发现内存泄漏.
那么,源代码分析有什么好的选择吗?
我很好奇的是Michael Adolph的ProDelphi,它不到AQTime成本的六分之一.你用它吗?AQTime值六倍的价值吗?
Addenum 2:我下载了AQTime和ProDelphi的试用版.
AQTime起初有点压倒性,有点令人困惑.花了几个小时才找到了解决它所需的一些技巧.
ProDelphi非常像我习惯的GpProfile.但是它的窗户混乱而且令人困惑,而且它不如GpProfile那么好.
对我来说,差异似乎是:
ProDelphi会更改您的代码.AQTime没有.如果出现问题,更改代码可能会损坏您的数据,但我对GpProfile的体验是它从未发生在我身上.加一个AQTime.
ProDelphi要求您关闭优化.但是你想要描述的是你的程序,它的优化程度,运行方式.加一个AQTime.
ProDelphi只能剖析功能或程序.AQTime可以归结为单独的线路.AQTime加2.
ProDelphi有一个免费版本,可以分析20个例程,其专业版本的成本不到100美元.AQTime是600美元.ProDelphi加4.
目前比分是4-4.你怎么看?
Addenum 3:Primoz Gabrijelcic计划让GpProfile再次运作.请参阅他对以下一些回复的评论.他在StackOverflow上饰演Gabr.
Addenum 4:看起来似乎可能有一个分析器解决方案.参见Andre的开源asmprofiler,如下所述.
我的Delphi 2006应用程序遇到了一些性能问题.你能建议任何有助于我找到瓶颈的分析工具吗?
即像turbo Profiler这样的工具
在我的程序中,我处理了数百万个具有特殊字符的字符串,例如"|" 分隔每个字符串中的标记.我有一个返回第n个令牌的函数,就是这样:
function GetTok(const Line: string; const Delim: string; const TokenNum: Byte): string;
{ LK Feb 12, 2007 - This function has been optimized as best as possible }
var
I, P, P2: integer;
begin
P2 := Pos(Delim, Line);
if TokenNum = 1 then begin
if P2 = 0 then
Result := Line
else
Result := copy(Line, 1, P2-1);
end
else begin
P := 0; { To prevent warnings }
for I := 2 to TokenNum do begin
P := …Run Code Online (Sandbox Code Playgroud) 我一直在测试性能和内存分析器AQTime,看看是否值得为我的Delphi应用程序花费那么大的$$$.
让我感到惊讶的是它如何在不修改应用程序源代码的情况下为您提供源行级别性能跟踪(包括每行执行的次数以及该行所用的时间),并且不会为此添加过多的时间调试运行.
他们如此高效地这样做的方式让我觉得这里可能会使用一些我不知道的技术/技术,这对我们来说是有用的.
你知道他们用什么样的方法来逐行捕获执行而不需要更改代码吗?
是否还有其他分析工具也可以进行非侵入式逐行检查,如果有,他们是否使用相同的技术?
我试图加速应用程序中的某个例程,我的剖析器AQTime确定了一种方法,特别是作为瓶颈.这种方法已经存在多年了,并且是"misc"单元的一部分:
function cwLeftPad(aString:string; aCharCount:integer; aChar:char): string;
var
i,vLength:integer;
begin
Result := aString;
vLength := Length(aString);
for I := (vLength + 1) to aCharCount do
Result := aChar + Result;
end;
Run Code Online (Sandbox Code Playgroud)
在我正在优化的程序部分中,该方法被称为~35k次,并且它花费了惊人的56%的执行时间!
很容易看出它是一种可怕的方式来左键填充字符串,所以我用它替换它
function cwLeftPad(const aString:string; aCharCount:integer; aChar:char): string;
begin
Result := StringOfChar(aChar, aCharCount-length(aString))+aString;
end;
Run Code Online (Sandbox Code Playgroud)
这显着提升了.总运行时间从10,2秒增加到5.4秒.真棒!但是,cwLeftPad仍然占总运行时间的13%左右.有没有一种简单的方法可以进一步优化这种方法?
我在我的项目中使用了很多IN,并且我有很多这些警告:
[DCC警告] Unit1.pas(40):W1050 WideChar在集合表达式中减少为字节char.考虑在SysUtils单元中使用CharInSet函数.
我做了一个快速测试,使用CharInSet而不是IN从65%-100%慢:
if s1[i] in ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] then
Run Code Online (Sandbox Code Playgroud)
VS
if CharInSet(s1[i], ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']) then
Run Code Online (Sandbox Code Playgroud)
这是2个测试的代码,一个用于循环通过较短的字符串,一个循环通过一个大字符串:
在表单上添加2个按钮我测试了这个短字符串:
procedure TForm1.Button1Click(Sender: TObject);
var s1: string;
t1, t2: TStopWatch;
a, i, cnt, vMaxLoop: …Run Code Online (Sandbox Code Playgroud) 我设置了一个项目并运行它,并在Process Explorer中查看它,结果发现它使用的内存比我想象的多5倍,只是为了启动它.现在,如果我的程序进展太慢,我将它连接到一个分析器并让它告诉我使用了我的所有循环.是否有任何类似的工具我可以连接它并让它告诉我什么是使用我的所有内存?
delphi ×6
profiling ×4
performance ×3
aqtime ×2
optimization ×2
algorithm ×1
delphi-xe7 ×1
memory-leaks ×1
parsing ×1
profiler ×1
string ×1
token ×1