Межмодульная оптимизация ускорила не только работу, но и сборку большого файла
Ожидание было такое: -flto даёт 1,03–1,60 раза в работе, а сборка становится дольше примерно вдвое — это и было доводом не включать флаг по умолчанию, а завести отдельную строку «собрать быстро» / «работать быстро».
Замер это ожидание опроверг на большом файле. Точка самораскрутки (bootstrap/, 6,2 МБ порождённого C) собирается:
make -j4 | |
|---|---|
-O2 | 38,7 с |
-O2 -flto | 17,7 с |
То есть вдвое БЫСТРЕЕ, а не вдвое медленнее. Причина понятная: с -flto шаг cc -c перестаёт оптимизировать и становится дешёвым, а вся оптимизация уезжает на компоновку, где gcc режет программу на разделы и обрабатывает их параллельно. На маленькой программе выигрывать нечему, там разделов один, и плата за компоновку видна — там сборка и правда дороже.
Отсюда решение: флаг включён по умолчанию, а не спрятан в отдельную строку. Кому нужна быстрая сборка вместо быстрой работы — make CFLAGS='-std=c99 -O2', и это написано прямо в порождаемом Makefile.
Второе, что проверено, потому что об этом легко забыть: ar rcs строит указатель архива и с -flto (binutils с подключаемым модулем). Иначе напечатанная библиотека собиралась бы, а линковаться с ней было бы нельзя.
Поправка 20 августа 2026. Направление подтвердилось повторно, абсолютные числа — нет: точка раскрутки выросла с 6,2 МБ до 19,3 МБ, и на том же make -j4 вышло 93,7 с без LTO против 58,4 с с LTO. Отношение съехало с 2,2× на 1,6×. Числа ниже читать как «замер на точке в 6,2 МБ», а не как нынешнее состояние — см. building-the-binary-costs-a-minute-not-an-hour.
Чем подтверждено. Ветка work/skorost, коммит c903983. Времена — по /usr/bin/time -v на тихой машине, один прогон каждого варианта (разница вдвое много больше разброса прибора в 30 %). Сборка проходит с полным строгим набором -Werror -pedantic без единого предупреждения.
Чем ограничено. Числа сняты на gcc 15.2.0. У clang устройство LTO другое (ThinLTO против полного), и переносить эти времена на него нельзя.
Связано: type-inference-answers-with-a-node-mark, biggest-win-for-least-work