這是我關于 SO 的第二個問題,我希望我能正確格式化它。
我在作業中發現 TFileStream 比 TMemoryStream 慢,我真的不知道為什么會這樣。因此我決定做一些測驗。
在我發現此行為的應用程式中,我將所有檔案加載到一個檔案夾中,并且對于每個檔案,我必須逐位元組讀取它。從切換TFileStream到TMemoryStream執行后變得即時。為了測驗這一點,我制作了下面的函式,其中同一個FileName檔案TStream Nr(Siz
我用來測驗它的功能是:
第一個是對 的測驗TFileStream,因為它沒有LoadFromFile我每次都必須創建和銷毀它的方法。
function TestFileStream(Nr, Siz: Integer): Double;
var
sw: TStopWatch;
Stream: TFileStream;
I: Integer;
buffer: TBytes;
begin
sw := TStopWatch.StartNew;
System.SetLength(buffer, Siz);
for I := 0 to Nr - 1 do
begin
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
Stream.Position := 0;
while Stream.Position Siz < Stream.Size do
Stream.ReadBuffer(buffer, Siz);
finally
Stream.Free;
end;
end;
Result := sw.Elapsed.TotalSeconds;
sw.Stop;
end;
第二個是對 的測驗TMemoryStream,這一次TMemoryStream也是創建和銷毀的Nr時間。
function TestMemoryStream(Nr, Siz: Integer): Double;
var
sw: TStopWatch;
Stream: TMemoryStream;
I: Integer;
buffer: TBytes;
begin
sw := TStopWatch.StartNew;
System.SetLength(buffer, Siz);
for I := 0 to Nr - 1 do
begin
Stream := TMemoryStream.Create;
try
Stream.LoadFromFile(FileName);
Stream.Position := 0;
while Stream.Position Siz < Stream.Size do
Stream.ReadBuffer(buffer, Siz);
finally
Stream.Free;
end;
end;
Result := sw.Elapsed.TotalSeconds;
sw.Stop;
end;
第三個是對 的測驗TMemoryStream,這次TMemoryStream是創建一次。
function TestKeepMemoryStream(Nr, Siz: Integer): Double;
var
sw: TStopWatch;
Stream: TMemoryStream;
I: Integer;
buffer: TBytes;
begin
sw := TStopWatch.StartNew;
System.SetLength(buffer, Siz);
Stream := TMemoryStream.Create;
try
for I := 0 to Nr - 1 do
begin
Stream.LoadFromFile(FileName);
Stream.Position := 0;
while Stream.Position Siz < Stream.Size do
Stream.ReadBuffer(buffer, Siz);
end;
finally
Stream.Free;
end;
Result := sw.Elapsed.TotalSeconds;
sw.Stop;
end;
結果如下:
Nr = 100, Siz = 1
TFileStream: 27,8980448s
TMemoryStream: 0,1571709s
TMemoryStream Kept: 0,1607682s
Nr = 100, Siz = 16
TFileStream: 1,7674029s
TMemoryStream: 0,044709s
TMemoryStream Kept: 0,0432958s
Nr = 100, Siz = 4096
TFileStream: 0,0427971s
TMemoryStream: 0,0325959s
TMemoryStream Kept: 0,0316288s
令我感到奇怪的是,它TMemoryStream使用 aTFileStream來加載檔案并且該ReadBuffer方法是從 繼承的TStream,因此就我的理解而言,應該沒有區別。你有一個可以解釋這個的想法嗎?
uj5u.com熱心網友回復:
如果你的Siz引數很小,TFileStream每次都會訪問磁盤以讀取很小的資料塊,而在你的代碼中TMemoryStream訪問磁盤一次,然后從記憶體中讀取小塊。如果您將Siz變數設定為磁盤上檔案的大小,您應該不會看到差異。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/519524.html
標籤:德尔福文件读取
上一篇:有沒有辦法設定快捷方式來“重新運行”DelphiLSP實體?
下一篇:如何用\..\擴展路徑
