Затраты на вызов функции DLL - PullRequest
7 голосов
/ 03 сентября 2011

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

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

1 Ответ

12 голосов
/ 03 сентября 2011

Мой ответ основан на том, как работает динамический компоновщик Linux / glibc / ELF, но я бы предположил, что общий ответ такой же для других платформ:

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

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

Вот ссылка на довольно хороший обзор этого процесса: http://www.technovelty.org/linux/pltgot.html

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