用SystemMonitor可以分析客户端与服务端的每一次交互做了什么,传输的大小等,可以分析瓶颈点是否在网络或者服务器上。
如果瓶颈点在客户端,比如有一系列长时间的运算,那么定位速度瓶颈就比较困难了,因为单步执行无法只能定位错误,不能分析速度。可以在几个关键点上记录下来发生的时间,然后分析这些时间差来找速度慢的点。
例如:定义一个记录日志的函数
procedure AddLog(msg: String);
var
fs: TStream;
wr: TWriter;
begin
fs := nil;
wr := nil;
try
try
fs := TFileStream.Create('c:\debug.txt', SysUtils.fmOpenWrite);
except
fs := TFileStream.Create('c:\debug.txt', Classes.fmCreate);
end;
fs.Seek(0, TSeekOrigin.soEnd);
wr := TWriter.Create(fs, 1024);
wr.WriteStr( SysUtils.Format('happend:%d %s'#13#10, [Borland.Delphi.Windows.GetTickCount, msg]));
finally
wr.Free;
fs.Free;
end;
end;
procedure AddLog1(msg: String);
var
fs: TStrings;
begin
fs := TStringList.Create;
try
try
fs.LoadFromFile('c:\debug.txt');
except
end;
if (fs.Count>0) and (Length(fs[fs.Count-1])=0) then
fs.Delete(fs.Count-1);
fs.Add(SysUtils.Format('happend:%d %s'#13#10, [Borland.Delphi.Windows.GetTickCount, msg]));
fs.SaveToFile('c:\debug.txt');
finally
fs.Free;
end;
end;
在需要分析的地方调用这个函数来记录
AddLog('start');
proc1();
AddLog('after proc1');
proc2();
AddLog('after proc2');
DataSet.First;
while not DataSet.Eof do
begin
...
DataSet.Next;
end;
AddLog('after DataSet loop);
AddLog('end');
执行了这段代码以后,只要拿出c:\debug.txt来分析一下就知道速度瓶颈点了 |