ASP.NET CompilationMode AUTO V NEVER
-
06-07-2019 - |
문제
내 ASPX 페이지에 인라인 C# 코드 블록이 없다고 가정 해 봅시다.
그래서 안전하게 설정할 수 있습니다
<pages compilationMode="Never" />
... 내 web.config 파일에서 컴파일 오류에 대해 걱정하지 않습니다.
성능 측면에서 다음 설정을 사용하는 데 페널티가 있습니까?
<pages compilationMode="Auto" />
즉, "자동"탐지에는 상당한 시간이 걸리나요?
해결책
의 영향 자동 아주 적은 것으로 보입니다. (분명히 이상 절대).
코드를 검사하면 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>.*?)%>";
...
}
아무것도 만나지 않으면 단순히 움직입니다. 검색은 상당히 저렴한 작업입니다. 가장 큰 히트는 코드 블록이 실제로 발견되어 컴파일되는 경우입니다.
다른 팁
나는 그 제안에 동의하는지 확실하지 않습니다 자동 보다 성능이 뛰어나야합니다 언제나. 거기에 비슷한 이것에 대한 질문과 나는 궁극적으로 '자동'(및 비 체결 페이지)는 더 나은 확장 성을 제공하는 수단으로 소개되었으며, 반드시 더 나은 성능 (초기 컴파일/구문 분석 오버 헤드)을 넘어서는 것은 아닙니다.
만약에 자동 모든 시나리오에서 더 성능이 뛰어 났으므로 왜 기본값이 아닌가?
소규모 고정 수의 어셈블리가있는 응용 프로그램은 표준의 혜택을 누릴 수 있습니다. 언제나 설정 및 현장 전체 사전 컴파일; SharePoint와 같은 CMS-esque 시나리오의 경우 런타임에 페이지가 변경되는 경우 자동 전단 필요성에서 유일한 옵션입니다.
우리 시나리오에서 설명하기 위해 내가 잃어버린 것은 JIT에서 % 시간 앱이 예열 된 후에도 현장 전체의 사전 컴파일을 사용한 후에도 변동이 있고 때로는 60%보다 높습니까? 이것이 200-500의 어셈블리 배치와 공통적이라면 자동 이러한 시나리오에서도.
자동 보다 성능이 뛰어나야합니다 언제나, 인라인 C# 코드를 추가 할 때 안전한 실패입니다.
추가 시간은 페이지를 컴파일 해야하는지 결정하는 데 소비됩니다. 절대 옵션.