Статическая и динамическая производительность библиотеки - PullRequest
7 голосов
/ 08 декабря 2010

Общепринято, что производительность статических библиотек выше, чем динамических. Мой вопрос: это также зависит от того, как DLL уже загружен в память? Я имею в виду, что после инициализации и всего, вызов функции и выполнение в случае динамических библиотек занимают больше времени, чем статические библиотеки?

Ответы [ 3 ]

11 голосов
/ 08 декабря 2010

Отказ от ответственности : Я кузнечик из Linux-fu, поэтому здесь и там (или просто везде) могут быть некоторые неточности. Но общая идея должна быть относительно правильной. И если это не так, я уверен, что хорошие ТАК люди быстро поправят меня. : -)

Да, и предоставленные мной ссылки ориентированы на Windows. Буду признателен, если кто-нибудь сможет предоставить правильные Linux-ориентированные ссылки.

Краткий ответ: Возможно. Однако, даже если это так, разница в производительности действительно незначительна.

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

Когда вы используете динамическую библиотеку, стоимость зависит от того, используете ли вы динамическое связывание во время загрузки или динамическое связывание во время выполнения .

При динамическое связывание во время загрузки компилятор по-прежнему генерирует код для непосредственного вызова функции, как если бы она была статически связана. Когда загрузчик процесса загружает DLL, он вызывает компоновщик времени выполнения для исправления памяти процесса, так что эти вызовы идут непосредственно к фактическим реализациям функций. Это должно произойти до того, как будет сделан любой вызов функции из загруженной библиотеки. в Windows это выполняется загрузчиком NT DLL, который вызывает LoadLibrary для DLL во время инициализации процесса. В Linux это выполняется компоновщиком среды выполнения, ld-linux.so.

При /DELAYLOAD динамическое связывание во время загрузки , процесс по сути такой же, за исключением того, что компилятор генерирует код для вызова небольших заглушек, который проверяет, загружена ли библиотека и, если нет, вызовет загрузчик NT DLL. Таким образом, DLL будет загружаться по требованию, и загрузчик процесса не должен загружать ее во время инициализации процесса. Это приводит к более быстрому запуску процесса, но производительность вызова остается той же. (Обратите внимание, что задержка загрузки страдает от других недостатков)

Я не знаю, есть ли соответствующая поддержка Linux, но я был бы удивлен, если бы не было.

С динамическим связыванием во время выполнения ваш код поддерживает указатели функций и решает, когда загрузить библиотеку. В Windows он должен использовать LoadLibrary и GetProcAddress, в Linux это dlopen, dlsym и dlclose. В любом случае последствия для времени запуска процесса такие же, как для задержки-загрузки динамическое связывание во время загрузки ; однако разыменование указателя при каждом вызове метода добавляет небольшую незначительную стоимость. (Хотя, если вы знаете, что делаете, вы можете сойти с ума и исправить вашу память процесса, чтобы избежать разыменования указателя. Однако попытка сделать это правильно на порядок больше, чем полезная выгода, которую вы получите за выполнение она.)

4 голосов
/ 08 декабря 2010

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

0 голосов
/ 01 августа 2017

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

Когда код распределяется между приложениями, лучше использовать библиотеки DLL с точки зрения производительности системы , поскольку общее давление памяти системы меньше (когда ОС может отображать представления разделов памяти по процессы, которые делает Windows).

...