让我们假设我的ASPX页面没有内联C#代码块。
因此,我可以安全地设置
<pages compilationMode="Never" />...in我的web.config文件,不用担心编译错误。
在性能方面,使用以下设置会有任何损失吗?
<pages compilationMode="Auto" />也就是说,“自动”检测是否需要大量的时间?
发布于 2009-09-13 04:10:22
Auto的影响似乎很小。(尽管显然比Never更多)。
如果我们检查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>.*?)%>";
...
}如果它没有遇到任何问题,它就会继续前进。搜索是一个相当便宜的操作-最大的打击是当实际找到代码块时,编译它们。
发布于 2009-10-17 15:31:11
我不确定我是否同意Auto应该比Always性能更好的建议。在这个问题上有一个similar的问题,我认为最终'Auto‘(以及未编译的页面)被引入是为了提供更好的可伸缩性,而不一定是更好的性能(除了初始编译/解析开销之外)。
如果Auto在每个场景中都表现得更好,为什么它不是默认的呢?
具有少量固定数量的程序集的应用程序将受益于标准的Always设置和站点范围的预编译;对于像SharePoint这样的类似CMS的场景,页面在运行时更改,出于剪切的需要,Auto是唯一的选择。
我在我们的场景(几百个程序集,运行时不变)中不知所措的是,在应用程序预热很久之后,甚至在整个站点预编译的情况下,JIT中的% Time为什么会波动,有时会高于60%?如果这在200-500个程序集部署中很常见,那么我也可以看到自动在这些场景中的好处。
发布于 2009-09-13 04:08:44
自动应该比Always性能更高,并且对于您添加内联C#代码时是一个安全的故障保护。
确定页面是否需要编译将花费额外的时间,与Never选项相比,这会增加一些开销。
https://stackoverflow.com/questions/1416711
复制相似问题