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#.

Дополнительное время будет потрачено на определение необходимости компиляции страницы, что добавляет немного накладных расходов по сравнению с опцией Никогда.

Другие вопросы по тегам