В статье достаточно много интересного, в том числе разбор и анализ генерируемого C-компиляторами машинного кода (рассматриваемые версии компиляторов, правда, на сегодняшний день несколько устарели).
Тем, кто не читал, рекомендую ознакомиться. Не "войны" ради, а просто ради интереса .
Ну, я под АРМ пишу недоось по работе. Основная её часть будет на Аде (компилятор GNAT, входящий в состав GCC), на асме только первичные обработчики прерываний и т.п. вещи (они уже написаны и даже типа работают). Так вот, выяснилось, что кодогенерация у GCC отнюдь не фонтан: транслятор переставляет блоки операторов, выполняемые по условию (т.е. тела if'ов), не помнит содержимое регистров и т.п. (оптимизация что -O2, что -O3). Для интереса перепроверил, переписав небольшую подпрограммку на Си -- с тем же результатом, т.е. здесь проблема не в фронт-энде компилятора, а именно в оптимизаторе-кодогенераторе. В общем, без всякого напряга извилин при ручном программировании под АРМ 5-10% инструкций можно благополучно выкинуть. Сдаётся мне, что и под ИА-32 написать более эффективно, чем делает компилятор, позиционируемый как очень эффективный, можно без особых проблем. Другое дело, что разработка на ассемблере более трудоёмка и занимает больше времени, но разница отнюдь не в разы. У меня, например, основное время уходит на документирование и т.п. вещи, а они вообще никак не связаны с используемым языком.
As long as the human programmer doesn't force the algorithm's convolutions, AWP allows for a safe reduction of 5-10% of instructions. It seems to me that coding for IA-32 is more efficient than what the compiler, advertised as highly efficient, performs. Assembler development is more time-consuming and labor-intensive, although the difference is negligible at best. For instance, I spend a considerable portion of my time on tasks that have nothing to do with the language being used but do need extensive documentation.