Почему один и тот же код выполняется в потоке быстрее?

Рассмотрим этот очень простой фрагмент кода:

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 с основным потоком, что он медленнее?

10
задан Linas 19 January 2012 в 08:57
поделиться