Лучше ли использовать NGEN для приложения ASP.NET, если мы знаем, что он не сильно изменится? Или JIT достаточно хороша?
Единственная причина, по которой я спросил, заключалась в том, что эта статья Джеффри Рихтера в 2002 году говорит:
And, of course, Microsoft is working quite hard at improving the CLR and its JIT compiler so that it runs faster, produces more optimized code, and uses memory more efficiently. These improvements will take time. For developers that can't wait, the .NET Framework redistributable includes a utility called NGen.exe.





NGen поможет только во время запуска - он не заставляет код выполняться быстрее, чем после JITting. В самом деле, я считаю, что есть некоторые оптимизации, которые делает NGen не, но JIT делает.
Итак, главный вопрос: есть ли у вас проблема со временем запуска? Я не знаю, сколько времени запуска приложения ASP.NET будет JITting по сравнению с другими затратами, кстати ... вам, вероятно, следует взглянуть на графики Performance Manager для JIT, чтобы узнать, сколько времени это вам действительно стоит. .
(Что касается доступности, наличие нескольких серверов, позволяющих выполнять скользящие перезапуски, даст вам гораздо больше преимуществ, чем один сервер с веб-приложением NGENed.)
Действительно ли ASP.NET использует сборку NGen?
Не могли бы вы подробнее рассказать о графиках Performance Manager? Если я погуглию, я нахожусь в рекурсии к этому сообщению :(
@ChristianGollhardt: Я далек от эксперта, но если вы откроете Performance Manager, вы сможете добавлять графики для самых разных вещей.
@JonSkeet - согласно Джеффу Рихтеру, NGen в ASP.NET или служебных библиотеках не должны получать никакого прироста производительности, поскольку они всегда загружаются как нейтральные к домену - см. Здесь в разделе «Игнорируемый файл NGen'd в некоторых сценариях загрузки домена» codeguru.com/csharp/.net/net_general/toolsand3rdparty/… Am I чего-то не хватает?
@DaveBlack: Ну, помимо всего прочего, эта статья была написана в 2002 году. Это было во времена C# 1.0. С тех пор очень многое изменилось. (С тех пор, как я написал этот ответ, тоже очень многое изменилось. Ему почти 10 лет.) Все еще вполне возможно, что NGen не поможет обычному ASP.NET, но я предупреждаю: «Вы должны проверить, ровно ли время JIT значительный "по-прежнему актуален.
Я изучал это сегодня вечером и наткнулся на следующее:
Среда CLR не может загружать изображения, созданные с помощью NGEN, в общий домен приложения. Поскольку стандартные сборки ASP.NET являются общими и затем загружаются в общий домен приложения, вы не можете использовать Ngen.exe для их установки в кэш собственных образов на локальном компьютере. http://support.microsoft.com/kb/331979
Не уверены, относится ли это только к сборкам, на которые ссылается приложение ASP.net, или к самому приложению?
Это было только в случае .NET framework 1.0 / 1.1. В версии 2.0 и новее образы в машинном коде могут совместно использоваться в доменах приложений. Посмотреть разные версии msdn.microsoft.com/en-us/library/6t9t5wcf.aspx
NGen не подходит для ASP.NET - создание .dll в папке bin не является последним шагом - они снова компилируются с настройками web / maching.config, примененными к вашей папке C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files. Вместо NGen, чтобы уменьшить время начальной загрузки, используйте инструмент публикации веб-сайта или aspnet_compiler.exe.
Я не уверен, что основным преимуществом NGEN является только время запуска - если приложение страдает от высокого % Времени в JIT, это указано как возможное средство: http://msdn.microsoft.com/en-us/library/dd264972(VS.100).aspx.
Обсуждение тесно связано с другим вопросом о том, как Машинный код JIT кэшируется и повторно используется?
Да, это видео на YouTube демонстрирует это на самом деле Видео настройки производительности NGEN.exe
Но слово предостережения: проверьте, проверьте, а затем примените его.
NGen помогает ускорить запуск. Например, Документация Entity Framework говорит о преимуществах работы NGen:
Empirical observations show that native images of the EF runtime assemblies can cut between 1 and 3 seconds of application startup time.
Контекст - это просто сборки Entity Framework. NGenning других сборок обеспечит дополнительное ускорение.
Прежде чем идти по маршруту NGEN, лучше сначала посмотреть, можно ли сократить количество загружаемых ссылок на сборки, а затем перейти по маршруту NGEN.