Добавить комментарий

Delphi

Умножение vs Сдвиг

Проверим на простеньком тесте:

program SpeedTest;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.Classes,
  System.SysUtils,
  System.Diagnostics;

const
  cTestSize = 2000000000;

function Mul16:integer;
var
  i, j, k: Integer;
  t : TStopwatch;
begin
  k := 3;
  t := TStopwatch.StartNew;
  for i := 1 to cTestSize do
    j := k * 16;
  t.Stop;
  result := t.ElapsedMilliseconds;
end;

function Shl4:integer;
var
  i, j, k: Integer;
  t : TStopwatch;
begin
  k := 3;
  t := TStopwatch.StartNew;
  for i := 1 to cTestSize do
    j := k shl 4;
  t.Stop;
  result := t.ElapsedMilliseconds;
end;


begin
  try
    WriteLn('Multiple 16 : ', FormatFloat('0.000', Mul16 / 1000));
    WriteLn('Shift 4     : ', FormatFloat('0.000',  Shl4 / 1000));
  except
    on e: exception do
      writeln(e.Message);
  end;
  writeln('I''m finished.');
  readln;
end.

Оптимизатор, конечно, отключен.
С удивлением, получаем:

Multiple 16 : 4.881
Shift 4     : 4.876
I'm finished.

Заглядываем в CPU Window, и видим объяснение. Умножение на степени двойки скомпилировалось в сдвиги и без нашей помощи.

Пробуем умножение на два и сдвиг на один бит. Сразу заглядываем в скомпилированное... 
Код тоже одинаковый. Сложение... 

Ну и напоследок, добавляем умножение на 19. Тут уж ни каких фокусов, j:=k*19; компилируется в imul
И на секундомере мы получаем:

Multiple 16 : 4.902
Multiple 19 : 4.898
Shift 4     : 4.891
I'm finished.

Вывод:

В современных Delphi, заменять умножения сдвигом как бы для ускорения - ненужные понты. 
Компилятор всё сделает сам. 

Да и умножение целых чисел на современных процессорах ничуть не медленнее сдвига.

Метки:

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Допустимые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и абзацы переносятся автоматически.
  • Вы можете цитировать другие сообщения, используя тэг [quote]

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и абзацы переносятся автоматически.