Библиотека сайта rus-linux.net
Цилюрик О.И. Linux-инструменты для Windows-программистов | ||
Назад | Компиляция и сборка приложений | Вперед |
Некоторые сравнения
Одинаково ли по производительности выполняются
процессы, собранные со своими объектными модулями статически и
динамически? Нет! И дело здесь не в том, что вызовы динамически
связываемых функций будут иметь некоторый уровень косвенности через
таблицы имён — это копейки... Существенно то, что объектные
модули для помещения в динамическую библиотеку должны компилироваться
с опцией «позиционно независимый код» (ключ -fpic
),
а такой код сложнее, менее производительный и хуже подлежит
оптимизации компилятором. В результате может быть некоторая потеря
производительности. Обычно это мало заметно, но в некоторых областях,
особенно в алгоритмах цифровой обработки сигналов (digital signal
processing - DSP: быстрые преобразования Фурье, авторегрессионные
фильтры, кодаки ... и многое другое) это может стать существенным.
Относительно расходования памяти. Естественно, динамические библиотеки гораздо экономичнее расходуют память за счёт исключения дублирования кода. Но это происходит, если размер библиотеки поддерживается разумно небольшой, и в одну библиотеку не наталкивается всё, что только можно придумать: если программе нужен хотя бы единый вызов из библиотеки, то загружается вся библиотека. Кроме того, не следует забывать, что хотя для N программ, использующих динамическую библиотеку, загружается и одна копия самой библиотеки, но с каждым из N процессов загружается таблица имён используемой библиотеки, то есть, в итоге, загружается N экземпляров таблицы. При объёмных библиотеках это может быть существенная величина.
Для экономной работы с памятью (особо для встраиваемых и малых архитектур) может оказаться перспективным обсуждавшийся ранее способ загрузки библиотек по требованию: обширная библиотека щепится на несколько более мелких, и каждая из них загружается только на период времени её прямого использования. Таким образом библиотеки могут поочерёдно грузиться в одну и ту же область памяти, что реализует схему оверлейной загрузки фрагментов кода.
Предыдущий раздел: | Оглавление | Следующий раздел: |
Данные в динамической библиотеке | Создание проектов, сборка make |