为什么在调用TImage.Picture.LoadFromFile之后代码仍继续?

时间:2019-12-09 17:36:22

标签: image delphi performance-testing

我正在对标准VCL TImage控件和各种其他第三方替代产品的性能进行比较。我正在使用GetTickCount来衡量图像加载所需的时间。实际上,这大约需要4秒钟,但是LoadFromFile()几乎立即让我惊讶!

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  FStart:= GetTickCount;
  imgStandard.Picture.LoadFromFile(txtFilename.Text);
  FEnd:= GetTickCount; //<-- Put a breakpoint here to observe immediate return in debug
  lblStandard.Caption:= IntToStr(FEnd-FStart)+' Msec';
end;

在视觉上将相同的JPEG文件加载到两个图像控件中所需的时间与与Graphics32中的TImage32进行比较的时间一样。两者均在此时间段(大约4秒)内阻止了UI。 GR32报告的速度例如为3734毫秒,而标准的报告仅为16毫秒。

为什么会这样?如何准确测量将图像真正加载到TImage中所需的时间?

1 个答案:

答案 0 :(得分:5)

  

为什么会这样?

两个控件之间的区别在于减压的处理方式。

  • 以这种方式使用VCL图像控件时,将从文件中读取压缩数据,但实际的解压缩仅在按需绘制控件时才按需进行。
  • 使用graphics32图像控件时,在加载文件时会发生解压缩。

几乎所有图像花费的时间都是在减压步骤中进行的,这解释了您的时间上的差异。

  

如何准确测量将图像真正加载到TImage中所需的时间?

您可以在调用imgStandard.Update之后立即插入对LoadFromFile的调用,这将强制进行绘制循环,从而强制执行减压步骤。