Является ли статически связанный исполняемый файл быстрее динамически связанного исполняемого файла? - PullRequest
24 голосов
/ 12 января 2011

Поскольку динамически связанные библиотеки должны разрешаться во время выполнения, статически связанные исполняемые файлы быстрее, чем динамически связанные исполняемые файлы?

Ответы [ 2 ]

17 голосов
/ 12 января 2011

Статическое связывание создает больший исполняемый файл, чем динамическое связывание, потому что оно должно компилировать весь код библиотеки непосредственно в исполняемый файл.Преимущество заключается в уменьшении накладных расходов, поскольку больше не нужно вызывать функции из библиотеки, и где-то от некоторого до заметно более короткого времени загрузки.

Динамически связанный исполняемый файл будет меньше, поскольку он выполняет вызовы во время выполнения для общего кода.библиотеки.В этом есть несколько преимуществ, но важными с точки зрения скорости или оптимизации являются сокращение объема дискового пространства и потребляемой памяти, а также улучшенная многозадачность из-за уменьшенного общего потребления ресурсов (особенно в Windows).

Так что это компромисс: есть аргументы, почему любой из них может быть немного быстрее.Это будет зависеть от множества разных вещей, например, от того, насколько критичные к скорости подпрограммы в программе основаны на вызовах библиотечных функций.Но важный момент, который следует подчеркнуть в приведенном выше утверждении, заключается в том, что он может быть незначительно быстрее. Разница в скорости будет почти незаметной , и ее будет трудно отличить даже от нормальных, ожидаемых колебаний.

Если вам действительно все равно, сравните ее и посмотрите.Но я советую, что это пустая трата времени, и что есть более эффективные и более важные способы увеличить скорость вашего приложения.В долгосрочной перспективе вам будет гораздо лучше, если принять решение «динамически связывать или статически связывать» с учетом других факторов, помимо скорости.Например, статическое связывание может быть целесообразным, если вам нужно упростить развертывание приложения, особенно в различных пользовательских средах.Или, динамическое связывание может быть лучшим вариантом (особенно если эти общие библиотеки не являются вашими собственными), потому что ваше приложение автоматически получит выгоду от обновлений, сделанных для любой из общих библиотек, которые оно вызывает, без необходимости поднимать палец.


РЕДАКТИРОВАТЬ: Microsoft рекомендует, чтобы вы предпочли динамическое связывание вместо статического связывания :

ItНе рекомендуется распространять приложения C / C ++, которые статически связаны с библиотеками Visual C ++.Часто ошибочно считается, что, статически связывая вашу программу с библиотеками Visual C ++, можно значительно улучшить производительность приложения.Однако влияние на производительность динамически загружаемых библиотек Visual C ++ незначительно почти во всех случаях.Кроме того, статическое связывание не позволяет обслуживать приложение и его зависимые библиотеки ни автору приложения, ни Microsoft.Например, рассмотрим приложение, которое статически связано с определенной библиотекой, запущенное на клиентском компьютере с новой версией этой библиотеки.Приложение по-прежнему использует код из предыдущей версии этой библиотеки и не получает преимуществ от улучшений библиотеки, таких как улучшения безопасности.Авторам приложений на C / C ++ настоятельно рекомендуется продумать сценарий обслуживания, прежде чем принимать решение о статической привязке к зависимым библиотекам и использовать динамическое связывание, когда это возможно.

6 голосов
/ 12 января 2011

Это зависит от состояния вашего диска и от того, могут ли библиотеки DLL использоваться в других процессах.Холодный старт происходит, когда ваша программа и ее DLL никогда не загружались.EXE без DLL имеет более быстрый холодный запуск, так как нужно найти только один файл.Вам может понадобиться сильно фрагментированный диск, который почти заполнен, чтобы не иметь этого случая.

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

Несколько похожий случай - это теплый запуск, запуск, при котором библиотека DLL все еще доступна в кеше файловой системы с момента ее предыдущего использования.Разница между холодным и теплым пуском может быть довольно значительной на вялом диске.Единственная причина, по которой всем нравится SSD.

...