Почему ASP.NET перекомпилирует (повторно JIT) все, когда меняется только одна вещь? - PullRequest
4 голосов
/ 19 марта 2009

У меня есть приложение ASP.NET 2.0 (установлено на IIS 6.0 из MSI), которое было скомпилировано как «веб-сайт» и предварительно скомпилировано / упаковано с использованием проекта веб-развертывания в Visual Studio 2005. (Я вставил в просьба к разработчикам рассмотреть возможность перехода на веб-приложение для следующей версии, но оно не изменится для этой версии).

Всякий раз, когда приложение перезагружается (например, вносится изменение в web.config), при первом обращении ASP.NET JIT прикладной программы. Как часть этого, он берет все сборки, необходимые для страницы входа в систему, и компилирует их в собственный код в каталоге Temporary ASP.NET Files 'assembly \ dl3', что занимает от 20 до 60 секунд. Это происходит только при переработке, что случается нечасто, но когда это происходит, загрузка страницы занимает намного больше времени, и я полагаю, что это можно оптимизировать.

По-видимому, необходимо учесть 122 DLL, некоторые из которых являются предварительно скомпилированным кодом, другие являются сторонними компонентами для веб-сайта (например, NHibernate.dll, компоненты отчетности и т. Д.)

Почему он перекомпилирует / повторно JIT все ? Почему он не обнаруживает, что большинство сборок не изменилось, и не пытается их изменить? Могу ли я доказать, что проблема заключается не в пакетной компиляции? (У меня <compilation debug="false"> установлено в web.config.)

Другие вопросы предполагают, что NGEN может быть полезен, но я читал, что его невозможно использовать в ASP.NET 1.x; мы используем 2.0, и я не могу найти чистый ответ в любом случае.

Ответы [ 5 ]

2 голосов
/ 11 апреля 2009

Из моего личного опыта медленная переработка часто вызывается NHibernate / ActiveRecord, если у вас много сущностей. См. http://nhibernate.info/blog/2009/03/13/an-improvement-on-sessionfactory-initialization.html для объяснения + возможное решение.

2 голосов
/ 09 апреля 2009

Вы можете улучшить время перезарядки, установив в GAC общие библиотеки DLL, которые меняются редко - например, NHibernate или инструменты отчетности. Это должно предотвратить их повторное соединение.

Как: установить сборку в глобальный кэш сборок

2 голосов
/ 19 марта 2009

Вы используете IIS? Я вполне уверен, что если вы перезапустите свой сайт в IIS, он примет любые изменения в конфигурации без копирования DLL.

0 голосов
/ 14 апреля 2009

Как вы можете быть уверены, что все находится в надлежащем состоянии, не перезагружая / не сбрасывая (или что бы то ни было) AppDomain? Представьте, что у вас есть что-то при запуске приложения (global.asax), которое устанавливает значение статического поля на основе значения конфигурации. Пока вы не сбросите весь AppDomain, вы не можете быть уверены.

Другая причина: нет способа выгрузить DLL-библиотеку .NET после ее загрузки, поэтому вам придется заново создавать домен приложения, когда что-то обновляется.

0 голосов
/ 20 марта 2009

Странно, что только копирование DLL занимает 20 секунд. Я бы посоветовал сделать еще одну проверку и убедиться, где находится узкое место.

...