Я не могу привести конкретные примеры, потому что это было слишком много лет назад, но было много случаев, когда рукописный ассемблер мог превзойти любой компилятор. Причины:
Вы можете отклоняться от соглашений о вызовах, передавая аргументы в регистрах.
Вы могли бы тщательно продумать, как использовать регистры, и избежать хранения переменных в памяти.
Для таких вещей, как таблицы переходов, вы можете избежать проверки границ индекса.
По сути, компиляторы выполняют довольно хорошую работу по оптимизации, и это почти всегда "достаточно хорошо", но в некоторых ситуациях (например, при визуализации графики), когда вы платите дорого за каждый отдельный цикл, вы можете использовать ярлыки, потому что вы знать код, где компилятор не мог, потому что он должен быть на безопасной стороне.
На самом деле, я слышал о каком-то коде рендеринга графики, где процедура, такая как процедура рисования линии или заполнения полигона, фактически генерировала небольшой стек машинного кода в стеке и выполняла его там, чтобы избежать непрерывного принятие решения о стиле линии, ширине, шаблоне и т. д.
Тем не менее, я хочу, чтобы компилятор генерировал хороший ассемблерный код для меня, но не был слишком умным, и они в основном это делают. На самом деле, одна из вещей, которые я ненавижу в Fortran - это шифрование кода в попытке «оптимизировать» его, как правило, без существенной цели.
Обычно, когда приложения имеют проблемы с производительностью, это связано с расточительным дизайном. В наши дни я никогда бы не порекомендовал ассемблер для производительности, если бы приложение не было настроено в течение всего дюйма, все еще не было достаточно быстрым и проводило все свое время в тесных внутренних циклах.
Добавлено: я видел множество приложений, написанных на ассемблере, и главное преимущество в скорости по сравнению с такими языками, как C, Pascal, Fortran и т. Д. Было в том, что программист был намного осторожнее при кодировании на ассемблере. Он или она собирается писать примерно 100 строк кода в день, независимо от языка, и на языке компилятора, который будет равен 3 или 400 инструкциям.