2011-02-16 16 views
10

Tengo una pregunta hipotética sobre las consecuencias de la eficacia del uso del manejo de excepciones en situaciones donde no se lanzan excepciones.Eficiencia de la excepción cuando no se arroja nada

Primero echar un vistazo a este C#:

int simpleSimon, cautiousCarol, dangerousDave; 

try 
{ 
    simpleSimon = int.Parse("fail"); 
} 
catch 
{ 
    simpleSimon = 1; 
} 

try 
{ 
    cautiousCarol = int.Parse("1"); 
} 
catch 
{ 
    cautiousCarol = 1; 
} 

dangerousDave = int.Parse("1"); 

Estoy seguro de que el código de Dave será el más rápido/más eficiente; mientras que Simon incurrirá en una gran penalización por lanzar una excepción.

Pero ¿qué pasa con Carol? Como ella no lanza excepciones, ¿incurre en una penalización? Si es así, ¿qué tipo y qué tan grande? (¿Penalización de rendimiento o uso de memoria adicional o cualquier otra cosa?)

+4

+1 para nombres de variables! – JonH

+1

posible duplicado de [Costo de rendimiento de 'probar' en C#] (http://stackoverflow.com/questions/867017/performance-cost-of-try-in-c) –

Respuesta

6

Es un detalle de implementación de JIT. El jitter x86 debe configurar 16 bytes en el marco de la pila para ayudar al CLR a encontrar el bloque catch apropiado en caso de que se produzca la excepción. Eso debería tomar alrededor de 3 nanosegundos. Ningún trabajo en absoluto para la fluctuación de fase x64, el filtrado de excepciones se implementa de forma diferente en la versión de 64 bits de Windows (basada en tablas en lugar de basada en la pila). La memoria adicional requerida es aproximadamente equivalente (datos de código frente a tabla).

Nada de esto debería importar con un código como este, convertir una cadena en un entero es una operación de E/S. El costo de obtener los datos en primer lugar es de 3 o 4 órdenes de magnitud más grande que cualquier análisis que realice. Y, por supuesto, utilizaría TryParse() si no confía en el origen de los datos. Procesar una excepción es bastante caro.

8

Sin penalización significativa por Carol. Solo ciertos saltos serán registrados y ejecutados si es necesario.

Como sugerencia, use int.TryParse(...) para evitar situaciones como esta.

Cuestiones relacionadas