[英]Delphi - Measure execution time per line of an unit
目前我正在研究 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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.