понедельник, 20 августа 2012 г.

Нюансы оптимизации. Битовый сдвиг вправо.

Оптимизация ради оптимизации не мной придуманное понятие. Столкнулся тут на днях...
Деление - достаточно трудоемкая для процессора операция.
Деление на два = битовый сдвиг значения на бит вправо, при этом сами затраты - 1 такт.
Казалось-бы оптимизация.
Но что мы получим в случае -1 (0xFFFFFFFF)?
На делении, как и полагается - ноль, а на сдвиге как и положено 0x7FFFFFFF
Удачной оптимизации :)

4 комментария:

  1. SAR
    но:
    1. компилятор и сам оптимизирует(а если "влево" - еще и через адресную арифметику)
    2. а в глобальном масштабе - еще и тупоконечные платформы бывают...

    ОтветитьУдалить
  2. а слона-то я и не заметил(0)
    обратил внимание только на знаковый бит.

    ОтветитьУдалить
  3. Такой код (Y := X div 2) Delphi оптимизирует так:

    mov esi, eax
    sar esi, 1
    jns +3
    adc esi, $00

    ОтветитьУдалить
    Ответы
    1. procedure TForm1.FormCreate(Sender: TObject);
      var
      X, Y: integer;
      begin
      X := -1;
      Y := X div 2;
      Caption := IntToStr(Y);
      end;

      Удалить