О пользе оптимизации
Возвращаясь к теме, затронутой в "Немного из мэйл листов FreeBSD, N1".
Archie Cobbs считает,
что проблемы, возникающие при сборке ядра с оптимизацией -O2,
связаны только с ассемблерными вставками.
John Polstra сообщает,
что ядро, собранное с параметрами оптимизации "-O2 -fomit-frame-pointer"
стало быстрее на 9% при работе с netgraph модулем, обслуживающем HTTP-запросы.
Кроме оптимизации -O, с которой обычно собираются все программы
под FreeBSD, Jason Andresen считает
единственно полезной оптимизацию -fomit-frame-pointer.
Но полезна она лишь в случае, если в программе очень часто используются
небольшие и быстрые процедуры gcc не сохраняет на стэк адрес
предыдущего фрэйма, хотя освобождающийся в этом случае регистр ebp всё же не используется.
Впрочем, есть мнение,
что даже если бы gcc использовал один регистр, то благодаря
внутреннему динамическому переименованию регистров на Pentium Pro/II/III/4,
код работал бы не сильно медленнее.
Вполне возможно, хотя лично я считаю, что одного регистра мало,
скорее всего, нужно хотя бы два.
Peter Wemm рекомендует
собирать программу под более современный процессор.
Например, при генерации кода для 386 процессора gcc
преобразует операцию умножения на константу в сдвиги и сложения, так как
они быстрее выполняются на этом процессоре. Однако на Pentium'е и выше
такой код будет работать медленнее, чем просто умножение.
Не знаю, в какой версии gcc это должно работать,
но у меня с флагом -mcpu=i686 gcc 2.95.2 вместо умножения на небольшие
константы упорно двигает, складывает или использует вычисление индексного
адреса. Хотя, например, умножение на 26 уже отличается.