【发布时间】: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