目前我正在研究性能改进在Delphi计算模块(bpl)。在过去的几天里,我发现了几行运行缓慢的代码。我们将执行时间从8分钟提高到3分钟。
我发现代码行很慢通过在所有单元中添加秒表,但是进行这些更改是耗时的.
procedure TCalculator.Execute;
begin
TStopwatchWrapper.Start(1);
CollectValues;
TStopwatchWrapper.Pause(1);
TStopwatchWrapper.Start(2);
CalculateOrderLines;
TStopwatchWrapper.Pause(2);
...
TStopwatchWrapper.ShowTimes;
结束;
procedure TCalculator.CollectValues;
begin
for {..} do
begin
{more timing}
end;
end;
计算单位为数百行。
我希望能够装饰一个单位,找到这些缓慢的代码行。我在想Spring4D拦截器,但这只适用于拦截外部调用。
是否可以测量累计执行时间按行还是按程序?没有在整个代码中添加秒表或分析调用。
提前谢谢你。
我个人推荐使用SamplingProfiler(该网站相当过时-它可以很好地处理来自最新Delphi版本的可执行文件,它可能不会自动拾取搜索路径)。它通常可以完美地处理单个可执行文件(需要td32或map文件),但对于额外的运行时包或dll则不太好。
对此,我建议使用Intel VTune(完全免费使用)。要做到这一点,您需要为需要适当信息的任何二进制文件生成pdb文件(否则它将只报告地址)。这可以用map2pdb来完成。
如果你有一个AMD CPU,你可能想尝试AMD μProf -我没有个人经验,但从我听说它不如VTune。