Проблемы с кешированием DLL - PullRequest
4 голосов
/ 15 сентября 2011

С точки зрения максимально возможной производительности, влияет ли параметр связывания библиотеки static против dynamic на производительность из-за более высокого коэффициента пропуска кэша для DLL?

Моя идея заключается вкогда библиотека statically связана, вся программа загружается в одном месте или поблизости.Но когда dynamically связан, DLL может быть загружен куда-то, а его переменные могут быть размещены «слишком далеко».

Это правда или нет потери производительности для DLL в терминах cache miss ratio?(только быстрый код C / C ++)

Ответы [ 3 ]

3 голосов
/ 15 сентября 2011

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

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

Подведение итогов:

NO: динамическое или статическое связывание не влияет напрямую на промахи кэша. Динамическое связывание может уменьшить количество кеш-ошибок для часто используемых библиотек.

1 голос
/ 15 сентября 2011

Я бы сказал, профиль первым!

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

Вам потребуется пользовательское размещение и VirtualLock, чтобы получить некоторый контроль над физическим расположением страниц.

Примечания

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

  • Я бы сказал, что сегмент данных на самом деле не отображается, а скорее выделяется из частного пространства адресов процессов, поэтому локальность может быть аналогична статически связанным сегментам данных. Вы можете попробовать использовать отладчик / визуализатор кучи, чтобы узнать, как это работает).

Если вам нужны простые средства для получения полного контроля, просто выделите все из HEAP - используя предпочитаемую схему распределения. Если есть статические данные из DLL, просто скопируйте их в эту область?

1 голос
/ 15 сентября 2011

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

...