Как я могу помешать NGEN перебазировать мой код (что негативно влияет на производительность)?
Я просто хочу ускорить работу моего клиентского приложения на базе.NET и обдумываю NGEN-код.
Джеффри Рихтер написал это предупреждение о коде ngening:
• Низкая производительность по времени загрузки (перебазирование). Когда Windows загружает файл NGend, она проверяет, загружается ли файл по его предпочтительному базовому адресу. Если файл не может быть загружен по предпочтительному базовому адресу, Windows переместит файл, исправив все ссылки на адреса памяти. Это очень много времени, потому что Windows должна загрузить весь файл в память и изменить различные байты в файле. Для получения дополнительной информации о перебазировании см. Мою книгу: Программирование приложений для Microsoft Windows, 4-е издание (Microsoft Press).
Поскольку я не очень разбираюсь в этой теме, что я должен знать перед тем, как начать изменять настройки в своем проекте, и какие настройки мне следует изменить?
3 ответа
Согласно этому блогу Microsoft, "могут быть некоторые незначительные случаи, когда настройка базовых адресов в ОС Vista + имеет преимущество, но их можно в значительной степени игнорировать". Таким образом, хотя использование ngen улучшает время запуска, больше нет необходимости устанавливать базовые адреса, если вы не поддерживаете ОС до Vista. Это побочный эффект новой функции безопасности рандомизации макета адресного пространства.
Перемещение ваших библиотек DLL происходит только во время загрузки, после загрузки больше нет падений производительности из-за процесса перемещения. Конечно, в зависимости от количества и размера библиотек DLL (количество перемещений) время загрузки может существенно повлиять, что является проблемой, если ваше приложение часто запускается и останавливается.
Перебазирование библиотек DLL для сокращения времени загрузки требует постоянного мониторинга и настройки, если вы не оставили достаточно места между местами загрузки библиотек DLL, в результате возникают коллизии по мере роста библиотек DLL или добавления новых библиотек DLL в проект.
Вот статья MSDN, обсуждающая способы улучшить время запуска приложения. http://msdn.microsoft.com/en-us/magazine/cc163655.aspx
NGEN позволяет указать базовый адрес (также выставляется в настройках VS). Если вы собираетесь в NGEN, вы в основном хотите убедиться, что у вас нет перекрытия между библиотеками DLL. Если у вас есть перекрытие, то CLR будет вынужден перебазировать их, когда они загружены.