Рассмотрим этот очень простой фрагмент кода:
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;
Этот простой цикл выполняется за 4027 мс на моем ПК. Теперь, если я напишу тот же код, только используя другой поток:
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;
Этот метод, который делает то же самое, но в другом потоке, выполняется за 2910 мс! (Скомпилировано в Delphi XE с активной конфигурацией Release) Я заметил ~ 25% прирост потока независимо от того, сколько итераций у меня есть. Почему это так? Разве это не те же результаты?
РЕДАКТИРОВАТЬ: После дальнейших исследований я обнаружил, что, вероятно, причиной этого является ОС Windows 7. На машине с Windows 7 простой цикл в основном потоке выполняется примерно на 25% медленнее, чем асинхронная версия! Я даже пытался запустить этот же проект на том же ПК с Windows 7 в режиме Windows XP, и тогда оба результата были равны - ~ 3000 мс! Я совершенно потерялся здесь ... Что делает Windows 7 с основным потоком, что он медленнее?