Запуск веб-сайта занимает необычно много времени при первом обращении к нему (всего до 68 секунд) - PullRequest
4 голосов
/ 03 июня 2011

У меня есть приложение ASP.Net, которое запускается необычно долго при первом обращении к нему. Я провел некоторую трассировку и обнаружил, что на эту функцию затрачено 57 секунд:

Boolean System.Web.Compilation.WebDirectoryBatchCompiler.CompileNonDependentBuildProviders(ICollection)

и эта функция, в свою очередь, вызывает следующую 6 раз:

Void System.Web.Compilation.WebDirectoryBatchCompiler.CompileAssemblyBuilder(AssemblyBuilder)

Мой вопрос: что делает System.Web.Compilation.WebDirectoryBatchCompiler.CompileAssemblyBuilder? Мое веб-приложение уже скомпилировано, я не знаю, почему оно выполняет какую-либо компиляцию при запуске. Это нормально? Что-то происходит, о чем я не знаю?

Ответы [ 3 ]

5 голосов
/ 03 июня 2011

При запуске приложения ASP.NET происходит довольно много начальной загрузки. Это включает в себя запуск рабочего процесса, сборок, загруженных в AppDomain, а также компиляцию файлов в текущем каталоге. Этот процесс пакетной компиляции выполняется для каждой папки, что означает, что если я запрашиваю / в первый раз, пакетный компилятор просканирует папку на наличие поддерживаемых типов, скомпилирует их и кеширует результат. Это делается только в корневой папке /. Мой первый запрос к другой папке /OffRoot приведет к другой пакетной компиляции.

Если у вас есть предварительно скомпилированный сайт, среда выполнения все еще выполняет этот тип сканирования, но определяет, что ему не нужно ничего компилировать.

Существует важное различие между предварительно скомпилированным веб-сайтом и скомпилированным веб-приложением. Предварительно скомпилированный веб-сайт будет выполнять эту компиляцию первого экземпляра заранее, поэтому он должен загружать сборки только в AppDomain там, где это необходимо. В скомпилированном веб-приложении вы скомпилировали базовый исходный код, но файлы представлений (.aspx) не скомпилированы, поэтому он по-прежнему выполняет компиляцию в первый раз (динамическая компиляция).

1 голос
/ 03 июня 2011

AFAIK, ASP.NET основан на мире .NET ведения дел.Что, конечно, означает, что на самом деле есть две части для компиляции.Во-первых, вы компилируете исходный код в формат байт-кода .NET.Второе - это фактическое преобразование в формат, подходящий для реальной работы в вашей системе, обычно в режиме Just-In-Time.Это похоже на Java, хотя есть много различий на более низком уровне.

Проблема заключается в том, что в настоящее время он делает JITting заранее, что разработано специально.Для запуска и работы приложения ASP.NET может потребоваться некоторое время, и это именно та минута, которую вы видите.Я делаю , полагаю, что есть способ включить предварительный JITting до того, как кто-то действительно посетит сайт, но я не уверен в точном способе.Надеюсь, кто-то опубликует / ссылку на фактический метод для этого.

0 голосов
/ 03 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...