2009-09-13 3 views
3

Предположим, что на моей странице ASPX нет встроенных блоков кода C#.ASP.NET компиляцияMode Auto vs Никогда

Таким образом, я могу с уверенностью установить

<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<%([email protected])(?<code>.*?)%>"; 
    ... 
} 

Если он не встречает ни одного, он просто движется дальше. Поиск - довольно недорогая операция - самый большой хит - это когда коды кода фактически найдены, компилируя их.

+0

Как вы смогли просмотреть код System.Web.UI.TemplateParser? Отличный ответ BTW. – frankadelic

+0

@frankadelic Приветствия! Я использую ** Reflector ** (http://red-gate.com/products/reflector) - лучшая документация - это сам код :) –

0

Auto должна быть более производительным, чем Всегда, и является безопасным для отказоустойчивой, когда вы добавляете встроенный C# код.

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

2

Я не уверен, что я согласен с предложением о том Авто должно быть более производительным, чем Всегда. На этот вопрос есть вопрос similar, и я думаю, что в конечном итоге «« Авто »(и не скомпилированные страницы) были представлены как средство для обеспечения большей масштабируемости, не обязательно более высокая производительность (помимо начальных компиляции/разбора служебных данных).

Если Auto был более совершенным в каждом сценарии, почему бы ему не по умолчанию?

Применения, которые имеют небольшое фиксированное количество сборок, выиграют от стандарта Всегда установка и предварительная компиляция на сайте; для сценариев CMS-esque, таких как SharePoint, где страницы изменяются во время выполнения, Авто - единственный вариант, из необходимости сдвига.

То, что я затрудняюсь объяснить, в нашем случае (несколько сотен узлов, не меняя время выполнения) почему % времени в JIT колеблется и иногда выше, чем 60%, после того, приложение имеет были разогреты и даже с предварительным составлением сайта? Если это общее с развертыванием сборки 200-500, то я могу увидеть преимущество Auto в этих сценариях.

+0

Интересные вещи ... Я использую «Авто», чтобы обойти перезапуск домена приложения когда меняются страницы ASPX. Тем не менее, у меня все еще есть проблема при изменении файлов .resx http://stackoverflow.com/questions/1535027 – frankadelic

+0

Забавно, что вы должны упомянуть об этом - похоже, мы боремся с теми же проблемами! Существует простой способ обхода файлов resx (см. Ответ). – Nariman