Глянул ради интереса книгу "Профессиональное программирование на ассемблере x64 с расширениями AVX, AVX2 и AVX-512", только главы 15 и 16, что хочу сказать, написано
в общем всё верно, только треть советов по оптимизации уже не действенна, а ещё треть спорна — может как ускорять выполнение, так и замедлять, или применимость существенно зависит от прочего окружения. Например я где-то выше или в соседних темах приводил пример как логичная замена условного перехода на
cmov существенно
замедляла программу. Или совет всегда загружать всё в регистры, по идее верный, на практике часто выгодно ровно обратное, освободить максимум регистров под вычисления, а все константы читать из памяти (если их адрес известен на момент компиляции), потому что порты чтения памяти часто простаивают и такие чтения хорошо предсказываются, регистров же вечно не хватает. Пример недейственных советов: замена
mov r,0 на
xor/sub r,r, это очень существенно зависит от конкретной архитектуры и за последние лет 20 менялось несколько раз, становилось то выгоднее, то наоборот, сейчас же это обычно выполняется одинаково, как и многое другое, и на общую скорость практически всегда влияет ничтожно мало. Пример спорного совета: заменять
cmp на
test, он противоречит совету далее заменять
inc/dec на
add/sub, а спариваются (macrofusion) с условным переходом все эти команды одинаково. Ещё часть советов банальна до невозможности, типа "переходите на векторные команды", "заменяйте double на single", "уменьшайте длину команд за счёт ненужных префиксов", ... А некоторых полезных советов нету или хорошо замаскированы, например переупорядочивание кода чтобы более вероятным становился линейный путь выполнения даже ценой лишних переходов, или замена
div r64 на пару
div r32 (для делителей меньше
, которые в некоторых случаях могут выполниться быстрее!), или замена медленной
vpblend на эквивалентную связку
vpand+vpand+vpor, или замена векторной связки сравнений
cmp с
and и
or на одну
min/max, или методы размена памяти на скорость (и не только разворачиванием циклов, о котором сказано), да много чего ...
Пожалуй единственным бесспорным не банальным советом остаётся недостаточно прямо озвученный "относитесь с осторожностью к советам и всё проверяйте тестами/профилировщиком".
Так что книгу следует считать скорее введением в тему оптимизации на ассемблере, поверхностным обзором методов, она поможет повысить уровень со среднего немного выше, до начинающего профессионала (как бы глупо это не звучало), до реальных вершин скорости выполнения (достижения пиковой скорости работы) ещё пахать и пахать, уже по другим источникам.
PS. Впрочем, с претензиями выше я пожалуй неправ, книга действительно не для профессионалов, а для новичков в теме оптимизации на ассемблере и ассемблера вообще. Меня ввело в заблуждение первое слово в названии, а ведь в аннотации прямо сказано что ассемблеру как раз и предстоит лишь учиться по книге ...