2012-05-08 3 views
1

Я использую API-интерфейс POSIX dlopen/dlsym для загрузки динамических библиотек во время выполнения, а затем вызова функций из этих библиотек по имени.Должен ли я кэшировать возвращаемое значение dlsym?

Хорошая идея, с точки зрения производительности, сохранить результат dlsym где-нибудь? Или dlsym уже делает свое собственное кэширование и добавит еще один слой, который будет бесполезным или даже вредным? Функции можно было бы назвать многими, много раз, но у меня действительно нет способа заранее знать, какие из них или как часто они будут вызваны.

Спасибо!

+3

Преждевременная оптимизация - это корень всего зла. Не делайте ничего, пока вы не увидите * dlsym, вызывающий проблемы. – thiton

+0

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

+0

@ugoren: К сожалению, я заранее не знаю, какие функции будут использоваться (я даже не знаю, из каких библиотек они будут поступать). –

ответ

3

dlsym функция не делает кеширование. Он просто обращается к таблицам символов ELF (используя хеш-таблицу, которая не очень хорошо реализована).

Я думаю, вам следует избегать вызова dlsym с тем же именем и библиотекой много раз (например, миллионы раз).

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

Вы также можете уловить dlsym отказ как можно быстрее.

FWIW, вы можете позвонить dlopen и dlsym много раз. В частности, у вас может быть множество десятков тысяч dlopen -ed общих библиотек в Linux, как демонстрирует мой пример manydl.c. Но избегайте dlclose -в библиотеке, если у вас все еще есть активный кадр вызова для некоторой функции dlsym -ed. На самом деле, вы никогда не сможете позвонить dlclose, и ваша программа все равно будет работать (с небольшой потерей адресного пространства процесса).

Смежные вопросы