ASP.NET compilationMode Auto vs Never

时间:2009-09-13 02:44:13

标签: asp.net web-config compilation compilationmode

假设我的ASPX页面没有内联C#代码块。

所以,我可以安全地设置

<pages compilationMode="Never" />

...在我的web.config文件中,不用担心编译错误。

在性能方面,使用以下设置会受到任何惩罚吗?

<pages compilationMode="Auto" />

即。 “自动”检测需要花费大量时间吗?

3 个答案:

答案 0 :(得分: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>.*?)%>";
    ...
}

如果没有遇到任何问题,它就会继续前进。搜索是一个相当便宜的操作 - 最大的打击是实际找到代码块,编译它们。

答案 1 :(得分:2)

我不确定我同意自动应该比始终更高效的建议。对此有一个similar问题,我认为最终“自动”(以及一般的非编译页面)是作为提供更好的可扩展性的手段而引入的,不一定是更好的性能(超出初始编译/解析开销)。

如果自动在每个方案中效果更高,为什么它不是默认值?

具有少量固定数量的程序集的应用程序将受益于标准的始终设置和站点范围的预编译;对于像CMS这样的场景,其中页面在运行时被更改,自动是唯一的选择,没有剪切的必要性。

在我们的场景中我无法解释的事情(几百个程序集,在运行时没有变化)是为什么 JIT中的%时间波动,偶尔高于60%,长应用程序预热后,甚至在网站范围内预编译?如果这与200-500装配部署相同,那么我也可以在这些情况下看到自动的好处。

答案 2 :(得分:0)

自动应该比始终更高效,并且在您添加内联C#代码时是安全的故障保护。

确定是否需要编辑页面需要额外的时间,与从不选项相比,这会增加一些开销。