Почему sub быстрее, чем add?

Я провёл измерение времени выполнения разных инструкций и обнаружил, что инструкция sub выполняется до 2.5 раз быстрее инструкции add. Естественно, не поверил, сгенерировал кучу тестов.

Методика тестирования:

Тест состоит из двух файлов, .asm и .cpp.

В .asm объявлены две процедуры: одна состоит из N инструкций add rax, rax, вторая – из стольки же sub rax, rax.

В .cpp работает цикл, который M раз случайным образом (чтобы не было закономерностей) вызывает одну из двух процедур и измеряет время её выполнения. В итоге для обеих процедур выводится среднее количество тиков, затраченных на одну инструкцию. Оптимизация компилятором отключена.

В качестве N и M выбираются все пары из списка [10, 100, 1000, 10000, 100000], кроме тех, в которых N*M превышает 10^8.

Каждый тест запускается 100 раз, результат усредняется. Тестирование проводилось на не нагруженной машине.

Если посмотреть на гистограмму, видно, что вычитание сильно выигрывает в скорости. С чем такое может быть связано?

UPD: Заменил операнды на rax и rdx, всё встало на свои места. Всем спасибо.
  • Вопрос задан
  • 4142 просмотра
Решения вопроса 1
VenomBlood
@VenomBlood
sub reg, reg — специальный случай, обрабатываемый процессором также как и xor reg, reg, в этом случае специальный блок «ranamer» выполняет обнуление и удаляет инструкцию из pipeline еще до ее исполнения в engine.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
dlinyj
@dlinyj
Сомнительные результаты конечно, но объяснение может крыться в следующем. Во некоторых RISC-процессорах вообще отсутствует возможность сложения и есть только команда вычитания. Сложение достигается инвертированием полученного результата командой NOT. Быть может тут такая же история, просто команду NOT уже делает процессор в своём кристалле, отсюда и идёт задержка.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы