考慮這個非常簡單的代碼:爲什麼相同的代碼在線程中執行得更快?
uses Diagnostics;
const
ITER_COUNT = 100000000;
procedure TForm1.btn2Click(Sender: TObject);
var
val: Double;
i: Integer;
begin
sw := TStopwatch.StartNew;
val := 1;
for i := 0 to ITER_COUNT - 1 do
begin
val := val + i;
val := val - i;
val := val * 10;
val := val/10;
end;
sw.Stop;
mmo1.Lines.Add(Format('Simple completed in %D ms. Result: %G',
[sw.ElapsedMilliseconds, val]));
end;
這種簡單的循環在我的電腦上毫秒執行。現在,如果我寫相同的代碼,只是使用不同的線程:
procedure TForm1.btn3Click(Sender: TObject);
begin
sw := TStopwatch.StartNew;
TThread.CreateAnonymousThread(
procedure
var
val: Double;
i: Integer;
begin
val := 1;
for i := 0 to ITER_COUNT- 1 do
begin
val := val + i;
val := val - i;
val := val * 10;
val := val/10;
end;
sw.Stop;
TThread.Queue(nil, procedure
begin
mmo1.Lines.Add(Format('Async completed in %D ms. Result: %G',
[sw.ElapsedMilliseconds, val]));
end);
end
).Start;
end;
這種方法,做同樣的,但在不同的線程中毫秒執行! (在Delphi XE中編譯的Release配置處於活動狀態)無論我有多少次迭代,我都會在線程中發現〜25%的增益。爲什麼這樣呢?它不應該是相同的結果嗎?
編輯: 經過進一步調查後,我發現可能是這個原因是Windows 7操作系統。在Windows 7機器上,主線程中的簡單循環比異步版本執行速度慢25%!我甚至嘗試在使用Windows XP模式的同一臺Windows 7電腦上運行這個相同的項目,然後兩個結果相同 - 〜3000ms!我完全迷失在這裏...... Windows 7對主線程的處理是什麼?
無法重現,我的筆記本電腦(〜2600毫秒)執行時間相同。 – kludg
對我來說也沒有什麼不同。 1947年和1949年ms在我的機器上,但由於我仍然使用Delphi 5作爲我的主要開發環境,因此我學到了一些新的東西,+1。 –
你在什麼樣的操作系統下進行測試? – Linas