Я провёл измерение времени выполнения разных инструкций и обнаружил, что инструкция 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, всё встало на свои места. Всем спасибо.