использовать ESI медленнее, чем EAX? - PullRequest
2 голосов
/ 14 декабря 2010

Эта часть asm намного медленнее, чем соответствующая часть, использующая регистр eax. Почему это так?

jmp .l2
.l1:

   dec ESI
.l2:
   cmp ESI, 0
   jne .l1

jmp .l2
.l1:

   dec EAX
.l2:
   cmp EAX, 0
   jne .l1

Ответы [ 4 ]

5 голосов
/ 14 декабря 2010

Производительность будет зависеть от того, для чего используются EAX и ESI, до и после выполнения этого фрагмента кода.В зависимости от архитектуры, процессор может распараллеливать команды, которые работают в разных регистрах;код, работающий с одним и тем же регистром, должен блокироваться.

(У меня нет более конкретного совета, кроме как доверять компилятору: он знает правильный способ размещения регистров, чтобы использовать преимущества параллелизма, и я не«т.)

1 голос
/ 14 декабря 2010

, части кода Boath имеют более или менее некоторую скорость исключения. Вы можете проверить скорость выполнения, выполнив команду rdtsc до процедуры и после процедуры, чтобы измерить (подсчитать) тактовые частоты выполнения процессора. Конечно, рутины должны начинаться с некоторого значения в регистре EAX и ESI. Не используйте огромные значения цикла, потому что планировщик задач может прервать текущую задачу в середине выполнения цикла, и вы получите неправильный результат. Однако, если какой-либо результат измерения значительно отличается, чем текущая задача была прервана планировщиком задачи, и вы должны игнорировать этот результат.

РЕДАКТИРОВАТЬ: ТЕСТЫ

Здесь я поставил оба теста, чтобы каждый мог проверить результаты:

var
  StartTicks                :Int64;
  EndTicks                  :Int64;

    procedure TForm9.ButtonEAXClick(Sender: TObject);
    begin
      asm
        rdtsc
        mov         dword ptr [StartTicks], eax
        mov         dword ptr [StartTicks + 4], edx
    //Start test
        mov         eax, 10000
    @Loop:
        dec         eax
        cmp         eax, 0
        jnz         @Loop
    //End test
        rdtsc
        mov         dword ptr [EndTicks], eax
        mov         dword ptr [EndTicks + 4], edx
      end;
      caption := IntToStr(EndTicks - StartTicks);
    end;

    procedure TForm9.ButtonESIClick(Sender: TObject);
    begin
      asm
        rdtsc
        mov         dword ptr [StartTicks], eax
        mov         dword ptr [StartTicks + 4], edx
    //Start test
        mov         esi, 10000
    @Loop:
        dec         esi
        cmp         esi, 0
        jnz         @Loop
    //End test
        rdtsc
        mov         dword ptr [EndTicks], eax
        mov         dword ptr [EndTicks + 4], edx
      end;
      caption := IntToStr(EndTicks - StartTicks);
    end;

10000 циклов на современном процессоре не приведут к разнице между выполнением рутины с использованием EAX или ESI.

0 голосов
/ 14 декабря 2010

Скорость регистров зависит от того, что вы делаете с ними, потому что каждый регистр имеет свою собственную схему.Например, ecx подключен к цепям счетчика, поэтому он будет быстрее, если используется в качестве счетчика, eax хорошо подключен к ALU, поэтому это лучший регистр для математических задач.Конечно, теперь вы можете использовать ecx для математики и eax в качестве счетчика, но в раннюю эпоху процессоров у программистов не было этой свободы.Фактически esi используется для доступа к памяти, поэтому он «лучше» подключен (пожалуйста, передайте термин, я не могу выразить себя лучше) с памятью.

0 голосов
/ 14 декабря 2010

Небольшой эффект также заключается в том, что в некоторых случаях инструкции, использующие AX / EAX, могут быть короче.Не так много, как это было в WAAAY в 8088 году, когда (из-за 8-битной шины данных и медленного доступа к памяти) процессор потратил МНОГО времени, просто пытаясь заполнить конвейер для запуска следующей инструкции.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...