Оптимизация GCC.
Автор : Jpiszcz
Перевод : Юрий Прушинский
Я - один из счастливых обладателей процессора Pentium 3 866Mhz. Всё было прекрасно, жизнь била ключом
[Примерно 45-го размера. :-) Прим.ред.], пока я не прочитал статью с freashmeat на тему оптимизации GCC
[После этого ключ заменил обух. :-) Прим.ред.]. Статья заставила меня призадуматься вот над каким вопросом: насколько быстрее gcc будет компилировать ядро, если его самого [gcc] немного оптимизировать? Недолго думая, я приступил к делу. Для начала я решил засечь время, затрачиваемое на компиляцию ядра без оптимизации. Думаю, что большинство пользователей Линукс рано или поздно приходят к тому, чтобы собрать своё ядро, так что надеюсь мой тест окажется кому-нибудь полезным. Итак, условия теста таковы:
- Сделать 10 контрольных компиляций ядра и таким образом вычислить среднее время.
- Сборка обычным gcc.
- Сборка оптимизированным gcc.
- Версия ядра - самая последняя из стабильной ветки.
- На данный момент это версия 2.4.20.
- Версия GCC тоже самая последняя из стабильных.
- На данный момент это версия 3.2.2.
И вот результаты, полученные при сборке неоптимизированным компилятором (configure;make;make install)
Среднее время, вычисленное из 10 запусков 'make bzImage':
12.42 минут (762 секунды)
Для оптимизации компилятора я использовал следующие ключи:
-O3 -pipe -fomit-frame-pointer -funroll-loops -march=pentium3 -mcpu=pentium3
-mfpmath=sse -mmmx -msse
Если вам любопытно узнать как это сделать, то почитайте FAQ в архиве с gcc. Я например, поступил следующим образом:
./configure ; make BOOT_CFLAGS="ключи оптимизации" bootstrap ; make install
Среднее время, вычисленное из 10 запусков 10 'make bzImage'
9.31 минут (571 секунд)
Вообще я скомпилировал практически всё, чем я пользуюсь на своей Линукс-машине. Если кому интересно, то для управления установленными пакетами я пользуюсь менеджером relink.
По результатам теста видно, что мы получаем прирост в скорости компиляции на 33% (3:11 минуты, или на 191 секунду быстрее). Это может показаться не ахти каким результатом, но при сборке больших программ (например QT или Mozilla) эта разница будет уже существенна. Замер времени для теста я сделал при помощи следующего несложного скрипта:
cd /usr/src/Linux
for i in seq 1 10
do
make dep
make clean
/usr/bin/time bzImage 2>> /home/war/log
done
А вот сведения о затраченном времени и средней загрузке процессора для каждой сборки:
Без оптимизации (Стандартный GCC-3.2.2):
720.88user 34.54system 12:43.97elapsed 98%CPU (0avgtext+0avgdata 0maxresident)k
719.06user 35.69system 12:42.09elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
719.14user 34.37system 12:39.64elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
720.52user 36.42system 12:46.68elapsed 98%CPU (0avgtext+0avgdata 0maxresident)k
721.07user 33.86system 12:41.59elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
718.95user 35.65system 12:41.31elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
721.83user 36.26system 12:51.54elapsed 98%CPU (0avgtext+0avgdata 0maxresident)k
720.29user 34.18system 12:40.63elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
719.14user 34.80system 12:39.19elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
721.16user 33.88system 12:41.93elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
С оптимизацией (GCC-3.2.2 w/ "-O3 -pipe -fomit-frame-pointer -funroll-loops
-march=pentium3 -mcpu=pentium3 -mfpmath=sse -mmmx -msse")
532.09user 33.62system 9:32.76elapsed 98%CPU (0avgtext+0avgdata 0maxresident)k
531.57user 32.92system 9:29.25elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
532.99user 33.12system 9:31.18elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
532.58user 33.16system 9:30.57elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
533.18user 32.96system 9:31.34elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
534.01user 32.21system 9:32.50elapsed 98%CPU (0avgtext+0avgdata 0maxresident)k
532.59user 33.41system 9:31.56elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
532.76user 33.68system 9:32.01elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
534.19user 32.54system 9:31.92elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
534.11user 32.76system 9:32.40elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
Обратите внимание, что для оптимизации я применил не самый лучший метод (использовал -fomit-frame-pointer), в частности для отладки. Тем не менее, моей целью было увеличение производительности компилятора, поэтому об остальном я не особо заботился.