Является ли DLL медленнее, чем статическая ссылка? - PullRequest
13 голосов
/ 11 ноября 2010

Я сделал библиотеку GUI для игр.Моя тестовая демонстрация работает на скорости 60 кадров в секунду.Когда я запускаю эту демонстрацию со статической версией моей библиотеки, это занимает 2-3% процессора в диспетчере задач.Когда я использую версию DLL, она использует около 13-15%.Это нормально?Так как я мог это оптимизировать?Я уже прошу его использовать / O2 для большинства функций inlining.

Ответы [ 4 ]

16 голосов
/ 11 ноября 2010

Не запускайте таймер производительности, пока у DLL не будет возможности выполнить свои функции один раз. Это дает время для загрузки в память. Затем запустите таймер и проверьте производительность. Затем он должен в основном соответствовать статической библиотеке.

Также имейте в виду, что расположение загрузки DLL может сильно повлиять на скорость ее загрузки. Базовые адреса по умолчанию для библиотек DLL - 0x400000. Если у вас уже есть какая-то другая DLL в этом месте, тогда процесс загрузки должен выполнить дорогостоящий шаг переадресации, который еще больше отнимает время.

Если у вас есть такой конфликт, просто выберите другой базовый адрес в Visual Studio.

5 голосов
/ 11 ноября 2010

Если вы вызываете DLL-функции, они не могут быть встроены для вызывающей стороны. Вам следует немного подумать о своих DLL-границах.

Может быть, для вашего приложения лучше иметь небольшой загрузочный exe-файл, который просто выполняет основной цикл в вашей DLL. Таким образом, вы можете избежать больших накладных расходов на вызовы функций.

5 голосов
/ 11 ноября 2010

У вас будут накладные расходы на загрузку DLL (должно быть только один раз в начале). Он не связан статически с прямыми вызовами, поэтому я ожидал небольшого количества накладных расходов, но не очень.

Однако некоторые библиотеки DLL будут иметь гораздо больше накладных расходов. Я думаю о COM-объектах, хотя могут быть и другие примеры. COM добавляет много накладных расходов на вызовы функций между объектами.

0 голосов
/ 11 ноября 2010

Немного неясно, что статически / динамически связано.Является ли DLL вашей библиотеки статически связанной с ее зависимостями?Возможно ли, что DLL вызывает другие библиотеки DLL (это будет медленно)?Возможно, попробуйте запустить профилировщик из valgrind на своем исполняемом файле, чтобы определить, откуда исходит использование ЦП.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...