Pregunta

Supongamos que mi página ASPX no tiene bloques de código C # en línea.

Entonces, puedo configurar con seguridad

<pages compilationMode="Never" />

... en mi archivo web.config y no se preocupe por los errores de compilación.

En cuanto al rendimiento, ¿habría alguna penalización por usar la siguiente configuración?

<pages compilationMode="Auto" />

es decir hace " auto " la detección toma algún tiempo significativo?

¿Fue útil?

Solución

El impacto de Auto parece ser muy pequeño. (Aunque obviamente más que Nunca ).

Si examinamos el código en System.Web .UI.TemplateParser , vemos en ImportSourceFile que el proceso se cancela antes de tiempo si el modo se establece en Never:

if (this.CompilationMode == CompilationMode.Never)
{
    return null;
}

Lo cual, por supuesto, es útil, y definitivamente el de menor impacto. Sin embargo, continuando con las rutinas en TemplateParser, podemos ver en ParseStringInternal el analizador literalmente escanea la plantilla cargada buscando variaciones de <%:

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);
    }
}

Tenga en cuenta el BaseParser.aspCodeRegex, que es una instancia de este patrón:

public AspCodeRegex()
{
    base.pattern = @"\G<%(?!@)(?<code>.*?)%>";
    ...
}

Si no encuentra ninguno, simplemente sigue adelante. La búsqueda es una operación bastante económica: el mayor éxito es cuando realmente se encuentran bloques de código, compilándolos.

Otros consejos

No estoy seguro de estar de acuerdo con la sugerencia de que Auto debería ser más eficiente que Siempre . Hay una similar pregunta sobre esto y creo que en última instancia ' Auto '(y páginas no compiladas, en general) se introdujeron como un medio para ofrecer una mejor escalabilidad, no necesariamente un mejor rendimiento (más allá de la sobrecarga inicial de compilación / análisis).

Si Auto fue más eficiente en cada escenario, ¿por qué no sería el predeterminado?

Las aplicaciones que tienen un número pequeño y fijo de conjuntos se beneficiarían de la configuración estándar Siempre y de la compilación previa en todo el sitio; para escenarios tipo CMS, como SharePoint, donde las páginas se cambian en tiempo de ejecución, Automático es la única opción, por necesidad de corte.

Lo que no puedo explicar en nuestro escenario (algunos cientos de ensamblajes, que no cambian en tiempo de ejecución) es la razón por la cual % de tiempo en JIT es fluctuante y ocasionalmente superior al 60%, de largo después de que la aplicación se haya calentado e incluso con la precompilación de todo el sitio? Si esto es común con las implementaciones de ensamblaje 200-500, entonces puedo ver el beneficio de Auto en esos escenarios también.

Automático debería ser más eficaz que Siempre , y es seguro a prueba de fallas cuando agrega código C # en línea.

Se dedicará más tiempo a determinar si es necesario compilar una página, lo que agrega un poco de sobrecarga en comparación con la opción Nunca .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top