【问题标题】:TBitmap SaveToFile Seems Slow in windows 10TBitmap SaveToFile 在 Windows 10 中似乎很慢
【发布时间】:2016-04-11 08:00:19
【问题描述】:

我在多启动机器 windows 7 和 windows 10 上运行以下相同的代码,基准测试显示 Windows 10 中的 SaveToFile 操作缓慢

Windows 10 500、953、875、688、578、750、453

Windows 7 109、125、109、110、125、140、125


var
  I, Tick: integer;
  Bitmap: TBitmap;
begin
  Bitmap := TBitmap.Create;
  Bitmap.SetSize(500,500);
  Bitmap.PixelFormat := pf24bit;
  Bitmap.Canvas.Brush.Style:= bsDiagCross;
  Bitmap.Canvas.Brush.Color:= clRed;
  Tick := GetTickCount;
  for I := 0 to 100 do
  begin
    SetBkColor(Bitmap.Canvas.Handle, RGB(random(255),random(255),random(255)));
    Bitmap.Canvas.FillRect(Rect(0, 0, 500, 500));
    Bitmap.SaveToFile(IntToStr(I)+'.bmp');
  end;
  ShowMessage(IntToStr(GetTickCount-Tick));
  Bitmap.Free;
end;

我认为 SaveToFile 在 Windows 10 中的工作方式不同,它会等到所有位图都保存后,在 Windows 7 中它的工作方式类似于后台任务,如果这是真的,如何使 SaveToFile 在 Windows 7 中工作。

更新

正如@ForguesR 提到的减速来自禁用它后的Windows 10 防御者,我得到了更好的结果 187, 171, 172, 178, 188, 156, 187 ,Windows 7 防御者不影响保存,我不知道关于 Windows 8。 是否有 API 或方法可以阻止 windows 10 防御者检查和减慢保存操作?

【问题讨论】:

  • Windows Defender 是否被禁用?这可能是速度变慢的原因。
  • "在 windows 10 中,它会等待所有位图都被保存,在 windows 7 中,它就像后台任务一样工作" - 这不是SaveToFile() 的工作方式,而且永远不会已。 SaveToFile() 是同步的,在文件完全写入并关闭之前它不会返回。当循环结束时(假设没有引发异常),所有 101 个文件都已完成。
  • 另外,GetTickCount() 并不总是准确的,因此请考虑改用TStopWatch。并确保在循环内对每个操作进行计时,而不仅仅是 SaveToFile() 本身。当您对 Canvas 进行更改时,其他事情会在幕后发生。尝试在本地缓存TRect,这样您就不会每次都重新计算它,并直接将Canvas.FillRect() 替换为Windows.FillRect()。如果您仍然认为SaveToFile() 是导致速度变慢的罪魁祸首,请使用调试器深入了解它并找出它到底在做什么。
  • @ForguesR 我关闭了 Windows 10 防御者并获得了更好的结果 187、171、172、178、188、156、187

标签: windows delphi io


【解决方案1】:

您在相同的硬件上运行相同的程序,但使用不同的操作系统。从那里开始,很明显 Windows 10 中有一些东西减慢了它的速度。正如您所发现的,通过禁用 Windows 10 Defender,您可以获得几乎相同的性能。

幸运的是,您无法通过代码“控制”防病毒软件。如果可以的话,传播病毒将是一件容易的事。

【讨论】:

  • 同样值得注意的是,在同一台计算机上拥有两个操作系统并不能保证它们具有相同的性能,即使所讨论的两个操作系统是相同的版本。为什么?每个操作系统都需要自己的系统分区,除非这些分区是以“并排”存在的方式创建的。但大多数情况下,分区的创建方式是一个接一个地放置,这意味着更接近硬盘空间开头的分区性能更好。
  • @SilverWarior 好点,但我认为它不会以 6 到 8 倍的速度影响性能。
猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
相关资源
最近更新 更多