"Need For Speed..."

Оптимизация GCC
Автор: Jpiszcz
Перевод: Юрий Прушинский


Я - один из счастливых обладателей процессора Pentium 3 866Mhz. Всё было прекрасно, жизнь била ключом [Примерно 45-го размера. :-) Прим.ред.], пока я не прочитал статью с freashmeat на тему оптимизации GCC [После этого ключ заменил обух. :-) Прим.ред.]. Статья заставила меня призадуматься вот над каким вопросом: насколько быстрее gcc будет компилировать ядро, если его самого [gcc] немного оптимизировать? Недолго думая, я приступил к делу. Для начала я решил засечь время, затрачиваемое на компиляцию ядра без оптимизации. Думаю, что большинство пользователей Линукс рано или поздно приходят к тому, чтобы собрать своё ядро, так что надеюсь мой тест окажется кому-нибудь полезным. Итак, условия теста таковы:

  1. Сделать 10 контрольных компиляций ядра и таким образом вычислить среднее время.
  2. Версия ядра - самая последняя из стабильной ветки.
  3. Версия GCC тоже самая последняя из стабильных.

И вот результаты, полученные при сборке неоптимизированным компилятором (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), в частности для отладки. Тем не менее, моей целью было увеличение производительности компилятора, поэтому об остальном я не особо заботился.


Copyright (c) 2003, Jpiszcz.

Hosted by uCoz