ASP.NET compilationMode Авто против Никогда
Давайте предположим, что моя страница ASPX не имеет встроенных блоков кода C#.
Итак, я могу смело устанавливать
<pages compilationMode="Never" />
... в моем файле web.config и не беспокойтесь об ошибках компиляции.
С точки зрения производительности, будет ли штраф за использование следующих настроек?
<pages compilationMode="Auto" />
т.е. "автоматическое" обнаружение занимает какое-то значительное время?
3 ответа
Влияние Авто, кажется, очень мало. (Хотя явно больше чем никогда).
Если мы рассмотрим код в System.Web.UI.TemplateParser, мы увидим в ImportSourceFile
этот процесс прерывается рано, если установлен режим Never
:
if (this.CompilationMode == CompilationMode.Never)
{
return null;
}
Что, конечно, полезно, и, безусловно, самый низкий эффект. Тем не менее, продолжая через процедуры в TemplateParser
мы можем видеть в ParseStringInternal
парсер буквально сканирует загруженный шаблон в поисках вариантов <%
:
if (!this.flags[2] && (match = BaseParser.aspCodeRegex.Match(text, startat)).Success)
{
string str3 = match.Groups["code"].Value.Trim();
if (str3.StartsWith("$", StringComparison.Ordinal))
{
this.ProcessError(SR.GetString("ExpressionBuilder_LiteralExpressionsNotAllowed", new object[] { match.ToString(), str3 }));
}
else
{
this.ProcessCodeBlock(match, CodeBlockType.Code, text);
}
}
Обратите внимание BaseParser.aspCodeRegex
, который является экземпляром этого шаблона:
public AspCodeRegex()
{
base.pattern = @"\G<%(?!@)(?<code>.*?)%>";
...
}
Если он не встречает ничего, он просто движется дальше. Поиск является довольно недорогой операцией - самый большой удар - это когда блоки кода на самом деле обнаруживаются, компилируя их.
Я не уверен, что согласен с предположением, что Auto должен быть более производительным, чем Always. Есть похожий вопрос по этому вопросу, и я думаю, что в конечном итоге "Авто" (и вообще не скомпилированные страницы) были введены в качестве средства, обеспечивающего лучшую масштабируемость, а не обязательно лучшую производительность (помимо начальных издержек компиляции / разбора).
Если бы Auto был более производительным в каждом сценарии, почему он не был бы по умолчанию?
Приложения, которые имеют небольшое фиксированное количество сборок, выиграют от стандартной настройки Always и предварительной компиляции всего сайта; для сценариев в стиле CMS, таких как SharePoint, где страницы изменяются во время выполнения, Auto является единственным вариантом из-за необходимости сдвига.
То, что я затрудняюсь объяснить в нашем сценарии (несколько сотен сборок, не изменяющихся во время выполнения), это то, почему % Time in JIT колеблется и иногда превышает 60%, еще долго после того, как приложение разогрелось и даже с предварительная компиляция всего сайта? Если это распространено при развертывании 200-500 сборок, то я вижу преимущество Auto в этих сценариях.
Auto должен быть более производительным, чем Always, и является безопасным средством защиты от сбоев, когда вы добавляете встроенный код C#.
Дополнительное время будет потрачено на определение необходимости компиляции страницы, что добавляет немного накладных расходов по сравнению с опцией Никогда.