Автор: Andi Peredri
В этой статье рассматриваются нюансы конфигурирования Qt версии 3.3 с целью получения более компактного объектного кода. Статья может быть полезна как разработчикам, тесно работающим с Qt, так и обычным пользователям, интересующимся вопросами более эффективного использования системных ресурсов.
Введение
Если вы хоть раз изучали вывод команды
./configure -h, запущенной в инсталляционном каталоге Qt, то вас наверняка интересовал вопрос о влиянии каждого конфигурационного параметра на будущую работу и эффективность Qt. Проведенное небольшое исследование поможет определить целесообразность установки того или иного параметра, взяв за основу его влияние на конечный размер библиотеки.
Для тестирования использовалась версия 3.3.0 библиотеки Qt для платформы Linux (XFree86 4.1.0). Компиляция (gcc 2.95) проводилась с помощью следующих шагов:
- ./make clean - очистка предыдущей конфигурации.
- ./configure -fast ... - конфигурирование библиотеки (без примеров).
- ./make src-install - сборка и установка библиотеки.
- ./make plugins-install - сборка и установка плагинов.
Результаты тестирования
Тестирование проводилось отдельно для каждого из 36 параметров конфигурирования. При этом измерялось изменение размера библиотеки в оперативной памяти и на диске.
Стартовый размер библиотеки (при компиляции без указания каких-либо параметров конфигурирования) - 10249 KB на диске и 10220 KB в оперативной памяти (по данным memstat). Так как относительная разница между размерами библиотеки в памяти и на диске не превышает 1%, в таблице приводятся изменения размеров Qt на диске:
Параметр |
>Размер, KB |
Краткое описание |
-disable-canvas |
align=right>-128 |
Отключение canvas-модуля двумерной графики |
-disable-iconview |
align=right>-175 |
Отключение модуля iconview |
-disable-network |
align=right>-367 |
Отключение модуля поддержки сети |
-disable-sql |
align=right>-489 |
Отключение SQL-модуля |
-disable-table -disable-sql |
align=right>-665 |
Отключение модуля таблиц (требуется также отключение SQL-модуля) |
-disable-xml |
align=right>-448 |
Отключение XML-модуля |
-no-big-codecs |
align=right>-487 |
Отключение поддержки многобайтных кодировок: японских, корейских, китайских и тайваньских |
-no-exceptions |
align=right>-3678 |
Отключение поддержки исключений C++ |
-no-ipv6 |
align=right>-2 |
Отключение поддержки протокола IPv6 |
-no-largefile |
align=right>-1 |
Отключение поддержки больших файлов |
-no-nis |
align=right>+2 |
>Отключение поддержки сетевых принтеров NIS (Network Information Service) |
-no-sm |
align=right>-15 |
Отключение поддержки X11 Session Manager |
-no-stl |
align=right>-343 |
Отключение поддержки Standard Template Library. Используйте, если вы предпочитаете работать с QTL |
-no-style-cde |
align=right>-14 |
Отключение CDE-стиля |
-no-style-motifplus |
align=right>-37 |
Отключение стиля motifplus |
-no-style-platinum |
align=right>-39 |
Отключение стиля platinum |
-no-style-sgi |
align=right>-43 |
Отключение SGI-стиля |
-no-style-windows -no-style-platinum |
align=right>-95 |
Отключение windows-стиля (требуется также отключение стиля platinum) |
-no-style-motif -no-style-motifplus -no-style-cde -no-style-sgi |
align=right>-157 |
Отключение motif-стиля (требуется также отключение стилей CDE, motifplus и SGI) |
-no-xft |
align=right>-130 |
Отключение расширения Xft (поддержка масштабируемых шрифтов со сглаживанием) |
-no-xinerama |
align=right>-4 |
Отключение поддержки многодисплейных конфигураций |
-no-xkb |
align=right>0 |
Отключение расширения XKB (X Keyboard Extension) |
-no-xrender |
align=right>-134 |
Отключение расширения XRender (поддержка альфа-смешивания). Отключение этого расширения приводит к отключению расширения Xft |
-no-xshape |
align=right>-1 |
Отключение расширения XShape (поддержка окон непрямоугольной формы) |
-system-nas-sound |
align=right>+9 |
Поддержка NAS (Network Audio System). Дополнительно требуется пакет nas-dev |
-system-libjpeg |
align=right>-113 |
Использование системной библиотеки libjpeg для плагина libqjpeg. Дополнительно требуется пакет libjpeg62-dev |
-system-libmng |
align=right>-189 |
Использование системной библиотеки libmng для плагина libqmng. Дополнительно требуется пакет libmng-dev |
-system-libpng |
align=right>-124 |
Использование системной библиотеки libpng. Дополнительно требуется пакет libpng2-dev |
-system-zlib |
align=right>-44 |
Использование системной библиотеки zlib. Дополнительно требуется пакет zlib1g-dev |
-cups |
align=right>+1 |
Поддержка Common UNIX Printing System. Дополнительно требуется пакет libcupsys2-dev |
-qt-gif |
align=right>+9 |
Поддержка GIF-формата |
-tablet |
align=right>+5 |
Поддержка планшетных устройств ввода, типа Wacom Tablet |
-thread -disable-opengl |
align=right>+41 |
Поддержка многопоточности |
-thread -enable-opengl |
align=right>+114 |
Поддержка OpenGL (требуется также поддержка многопоточности) |
-thread -dlopen-opengl |
align=right>+119 |
Поддержка OpenGL (библиотека будет загружаться только в случае явной необходимости с помощью системного вызова dlopen) |
-DQT_NO_SVG |
align=right>-119 |
Отключение поддержки формата SVG (Scalable Vector Graphics). Используется в QPicture как один из форматов импорта и экспорта |
В таблице отсутствуют данные, полученные при компиляции Qt без модулей kernel, widgets, dialogs, styles, tools и workspace. Несмотря на возможность удачной компиляции Qt без этих модулей, целесообразность такого решения остается
под вопросом, так как эти модули необходимы для работы других Qt-приложений, таких как Qt Config и Qt Designer. Также возникают трудности при компоновке полученной таким образом библиотеки с не-GUI приложениями (в 4-ой версии Qt
будет уделено больше внимания поддержке не-GUI приложений).
Консольная программа qmake, несмотря на то, что написана с использованием Qt, не требует для своей работы наличие самой библиотеки, так как статически компонуется с необходимыми объектными файлами. Если вы интересуетесь разработкой не-GUI приложений с помощью Qt 3, то можете применить аналогичный подход (см. qt/qmake).
Также в таблице отсутствуют параметры конфигурирования для SQL-модулей, так как они могут быть скомпилированы как плагины. Если есть возможность скомпилировать Qt-модуль как плагин, всегда поступайте именно так. Qt загружает плагины только в случае явной необходимости, поэтому они обеспечивают более экономное использование памяти. По этой же причине Qt-модули поддержки графических форматов JPEG и MNG по умолчанию скомпилированы как плагины.
Поддержка исключений
Если вы в своей программе не используете исключения, то можете смело отключить их поддержку в Qt (параметр -no-exceptions). Как видно из приведенной таблицы, этот параметр в наибольшей степени влияет на размер библиотеки Qt, и поэтому часто используется производителями дистрибутивов. При этом компилятор не будет генерировать таблицу диапазонов адресов кода со списками деструкторов и обработчиками исключений. В результате будет получен намного более компактный код.
Если вы применяете исключения в своей программе, то у вас все еще остается возможность воспользоваться параметром -no-exceptions. При этом нужно помнить, что генерируемые вами исключения не должны покидать обработчики сообщений, функции обратного вызова и слоты. В противном случае программа завершится аварийно.
Весомым аргументом против генерации исключений в слотах является то, что не всегда возможно определить в точке вызова сигнала слот-источник исключения (Qt позволяет связать один сигнал с несколькими слотами). Таким образом, механизм сигналов-слотов Qt в некоторой степени несовместим с механизмом исключений C++ и накладывает определенные ограничения на использование исключений в Qt-программах.
Сборка библиотеки и приложений
При работе над проектом выполните комплексную оценку используемых в нем средств и соответственно настройте Qt. Вот пример такой конфигурации для проекта, использующего модули network и xml:
./configure -disable-iconview -disable-canvas -disable-sql -disable-table
-no-big-codecs -no-exceptions -no-stl -no-style-motif
-no-style-motifplus -no-style-cde -no-style-sgi -system-libjpeg
-system-libmng -system-libpng -system-zlib -DQT_NO_SVG
Полученный после сборки размер библиотеки составляет 5022 KB на диске и 5000 KB в оперативной памяти. Это более, чем в два раза меньше начального размера библиотеки!
При установке новой версии Qt сохраните (переименуйте) файл-сценарий предыдущей конфигурации qt/config.status и используйте его вместо сценария qt/configure в дальнейшем. Это избавит вас от необходимости повторно вводить длинный перечень параметров конфигурирования Qt.
Также учтите, что параметры, указываемые при конфигурировании Qt, влияют на процесс сборки других Qt-приложений: Qt Assistant, Qt Designer, Qt Linguist и т.д. Поэтому занимаемый ими размер (и на диске, и в оперативной памяти) также значительно сократится:
|
Размер на диске, KB |
Размер в памяти, KB |
Приложение |
До |
После |
До |
После |
Assistant |
612 |
365 |
14060 |
10512 |
Designer |
4319 |
2485 |
15012 |
10784 |
Linguist |
520 |
334 |
10952 |
7504 |
Qtconfig |
236 |
143 |
10272 |
6844 |
Выводы
И разработчики, активно работающие с несколькими версиями Qt, и пользователи, использующие лишь одно Qt-приложение, одинаково заинтересованы в эффективном использовании системных ресурсов. Это становится возможным благодаря гибкой системе конфигурирования и модульной архитектуре Qt.
Однако нужно помнить, что узкоспециализированная конфигурация Qt может потребовать в будущем перекомпилирования как самой библиотеки, так и Qt-приложений, так как многие из рассмотренных нами параметров конфигурирования приводят к изменению прикладных интерфейсов программирования (API) и двоичного интерфейса (ABI) библиотеки.