Как сделать так, чтобы NGEN не перебазировал мой код (это отрицательно сказалось на производительности)?

Я просто хочу ускорить работу своего клиентского приложения на базе .NET и подумываю об использовании NGEN в коде.

Джеффри Рихтер написал предупреждение о создании кода ngening. :

• Низкая производительность во время загрузки (ребазинг). Когда Windows загружает файл NGend, она проверяет, загружается ли файл по предпочтительному базовому адресу. Если файл не может загрузиться по предпочтительному базовому адресу, Windows перемещает файл, исправляя все ссылки на адреса в памяти. Это занимает очень много времени, потому что Windows должна загрузить весь файл в память и изменить различные байты в файле. Дополнительные сведения о перебазировании см. В моей книге: «Программирование приложений для Microsoft Windows, 4-е издание» (Microsoft Press).

Поскольку я не очень разбираюсь в этой теме, что мне следует знать, прежде чем я начну изменять настройки в моем проекте, и какие настройки мне следует изменить?


person halfbit    schedule 28.08.2010    source источник
comment
Какую производительность вы хотите улучшить? Холодный запуск?   -  person Darin Dimitrov    schedule 28.08.2010
comment
@Darin - какую бы производительность я ни улучшил, это не требует от меня переделки кода. Это обучающее упражнение, и сегодня у меня нет конкретной проблемной области.   -  person halfbit    schedule 28.08.2010


Ответы (3)


Согласно этот блог Microsoft, "Могут быть некоторые крайние случаи, когда установка базовых адресов в ОС Vista + дает преимущество, но их можно в значительной степени игнорировать". Таким образом, хотя использование ngen действительно улучшает время запуска, больше нет необходимости устанавливать базовые адреса, если вы не поддерживаете ОС до Vista. Это побочный эффект новой функции безопасности рандомизации макета адресного пространства.

person Olly    schedule 11.04.2012

Перемещение ваших DLL происходит только во время загрузки, после загрузки больше не происходит снижения производительности из-за процесса перемещения. Конечно, в зависимости от количества и размера DLL (количества перемещений) время загрузки может быть значительно снижено, что является проблемой, если ваше приложение часто запускается и останавливается.

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

Вот статья MSDN, в которой обсуждаются способы улучшить время запуска приложения. http://msdn.microsoft.com/en-us/magazine/cc163655.aspx

person Chris Taylor    schedule 29.08.2010
comment
+1 для Rebasing DLL для сокращения времени загрузки требует постоянного мониторинга и настройки - person zhaorufei; 25.06.2013

NGEN позволяет указать базовый адрес (также отображается в настройках VS). Если вы собираетесь использовать NGEN, вы в основном хотите убедиться, что у вас нет перекрытия между библиотеками DLL. Если у вас есть перекрытия, тогда среда CLR будет вынуждена переустановить их при загрузке.

person Kent Boogaart    schedule 28.08.2010
comment
Какой промежуток мне нужен между базовыми адресами? - person halfbit; 28.08.2010
comment
Также ngen отменяет настройки VS? - person halfbit; 28.08.2010
comment
Необходимый зазор зависит от размера загруженного изображения, что довольно сложно предсказать. Если вы поместите между ними несколько мегабайт, вы, вероятно, будете в безопасности. - person bdonlan; 29.08.2010
comment
Какая версия ngen и какой вариант указать базовый адрес? Я проверил с помощью ngen .NET 4.0, с этим нет никаких опций, есть опция / AppBase, но она сильно отличается от базовой адресации. - person zhaorufei; 25.06.2013