Я прочитал все ответы (более 30) и не нашел простой причины: ассемблер работает быстрее, чем C, если вы прочитали и применили Справочное руководство по оптимизации архитектур Intel® 64 и IA-32 , поэтому причина, по которой сборка может быть медленнее, заключается в том, что люди, которые пишут такую медленную сборку, не читали Руководство по оптимизации .
В старые добрые времена Intel 80286 каждая инструкция выполнялась с фиксированным числом циклов ЦП, но после выпуска Pentium Pro, выпущенного в 1995 году, процессоры Intel стали суперскалярными, используя сложную конвейерную обработку: выполнение и регистр вне порядка Переименование. До этого на Pentium, выпущенном в 1993 году, существовали конвейеры U и V: линии с двумя конвейерами, которые могли выполнять две простые инструкции за один такт, если они не зависели друг от друга; но это было ничто в сравнении с тем, что «Выполнение вне очереди» и «Переименование регистров» появилось в Pentium Pro и почти не изменилось.
Чтобы объяснить в двух словах, самый быстрый код - это когда инструкции не зависят от предыдущих результатов, например Вы всегда должны очищать целые регистры (по movzx) или использовать add rax, 1
вместо этого или inc rax
, чтобы удалить зависимость от предыдущего состояния флагов и т. д.
Вы можете прочитать больше о выполнении заказа и переименовании регистра, если позволяет время, в Интернете достаточно информации.
Существуют также другие важные вопросы, такие как прогнозирование ветвлений, количество единиц загрузки и хранения, количество шлюзов, которые выполняют микрооперации, и т. Д., Но наиболее важной вещью, которую следует учитывать, является выполнение вне очереди.
Большинство людей просто не знают о выполнении вне очереди, поэтому они пишут свои программы ассемблера, например, для 80286, ожидая, что выполнение их инструкции займет фиксированное время независимо от контекста; в то время как компиляторы C знают о выполнении вне очереди и правильно генерируют код. Вот почему код таких незнакомых людей медленнее, но если вы узнаете, ваш код будет быстрее.