Оптимизация GCC
Автор: Jpiszcz
Перевод: Юрий Прушинский
Я - один из счастливых обладателей процессора Pentium 3 866Mhz. Всё было прекрасно, жизнь била ключом [Примерно 45-го размера. :-) Прим.ред.], пока я не прочитал статью с freashmeat на тему оптимизации GCC [После этого ключ заменил обух. :-) Прим.ред.]. Статья заставила меня призадуматься вот над каким вопросом: насколько быстрее gcc будет компилировать ядро, если его самого [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. Copying license http://www.linuxgazette.com/copying.html
Published
in Issue 88 of Linux Gazette, March 2003
Команда переводчиков:
Владимир Меренков, Александр Михайлов, Иван
Песин, Сергей Скороходов, Александр Саввин, Роман Шумихин, Александр Куприн,
Андрей Киселев, Игорь Яровинский, Юрий Прушинский
Со всеми предложениями, идеями и комментариями обращайтесь к Александру Куприну ([email protected]). Убедительная просьба: указывайте сразу, не возражаете ли Вы против публикации Ваших отзывов в рассылке.
Сайт рассылки: http://gazette.linux.ru.net
Эту статью
можно взять здесь: http://gazette.linux.ru.net/lg88/piszcz.html
Архивы
выпусков находятся здесь: http://gazette.linux.ru.net/archive/