Эффективность импорта по номеру, при импортировании по имени.


Перевод с блога The Old New Thing. Оригинал здесь.

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

Люди в большей степени знакомы с первой частью дуэта rebase+bind, чем со второй. Но именно "связывание" ускоряет поиск в таблице импорта. Когда DLL "связана" с другой DLL, информация об используемой DLL кэшируется в использующей. Эта информация содержит временную метку (чтобы загрузчик мог определить, соответствует ли действительности содержимое кэша) и адрес последней функции в библиоетке. Например, если у меня есть DLL, которая использует kernel32!LocalAlloc, то в моей DLL будет написано примерно следующее:

"Привет. Я бы хотел использовать функции из kernel32. Вся информация, которую я вам сообщу относится к KERNEL32.DLL от 00:56:36 4 Августа 2004. Что касается функции LocalAlloc, то я полагаю, что она находится по адресу 0x7C8099BD, а кроме того, вы можете обнаружить ее в таблице экспортируемых имен модуля kernel32 под номером 247."

Когда загрузчик производит импорт, он сверяет временную метку требуемого файла на диске с тем, что закешировано в DLL. Если они совпадают, то нет необходимости производить поиск функций вообще, он просто использует закешированное значение (0x7C8099BD). Если же они не совпадают (например, было обновление kernel32.dll), он все равно может использовать информацию из кэша: перед выполнением двоичного поиска по имени, он смотрит в позицию 247. Если там находится LocalAlloc, то затраты на двоичный поиск исключаются и накладные расходы по сравнению с чистым импортированием по номеру равны однократному сравнению строк.

Реклама
Запись опубликована в рубрике DLL. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s