2011-01-03 18 views
6

Tropezamos con algo de código antiguo que está lanzando y vacío captura de algunas excepciones elenco (alrededor del 20 por viaje :()C# moldeada Excepción

¿Y si ninguna está el impacto en el rendimiento estaban tomando debido a esto? ¿Debo estar preocupado esto o es la sobrecarga simplemente en el try/catch

que carecen Sorprendentemente información sobre el tema del rendimiento excepción con C#.

Gracias, desde su servidor.

+0

Terminó encontrando un problema con la esencia del método en sí y convirtió un monstruo de 30 líneas de moldes explícitos para probar las capturas, en dos líneas de código que pasaron de 3.8 segundos con 10000 elementos a 3 milisegundos. ¡Gracias a todos! –

Respuesta

9

Las excepciones se van a reducir la velocidad más que la mayoría de las líneas medias de código. En lugar de lanzar y luego atrapar la excepción, haga un cheque en su lugar. Por ejemplo

BAD

myType foo = (myType)obj; 
foo.ExecuteOperation(); 

BUENA

myType foo = obj as myType; 
if (foo != null) 
{ 
    foo.ExecuteOperation(); 
} 
0

las excepciones son caros, en cuanto al rendimiento. Último tiempo que mido ured estos, estaban tomando alrededor de un milisegundo completo para arrojar y atrapar cada excepción.

Evite usar excepciones como mecanismo de control de flujo.

+0

No debería manejar la excepción, simplemente no lanzando una excepción, podría manejarlo con gracia. Cualquier excepción que no pueda captar con gracia es el tipo de excepción que desea lanzar si sucede, no deberían suceder, por supuesto, si es cuidadoso. –

-1

Si no ha encontrado ningún problema de rendimiento y esta es la única manera que tiene de hacer ese algoritmo, continúe usando este método.

Quizás antes de tratar de transmitir pudieras ver con algunas cláusulas if si pudieras hacer el reparto.

+0

Las excepciones son caras. Es una mala práctica usarlos para una operación normal. –

+0

Nunca he dicho que no sean caros. Si lees mi publicación, he escrito que puede usarla solo si no detecta problemas de rendimiento o si es la única forma de escribir el algoritmo. –

+0

La expresión operativa aquí es "si ... esta es la única forma en que tiene que hacer ese algoritmo". A veces, debes romper las reglas. No es feo, pero es la verdad. Aunque probablemente refactorice dicho código para usar TryParse, la pregunta aún permanece: ¿qué haces si falla? –

0

Como han mencionado otros, las excepciones son costosas cuando se lanzan. En algunos casos, no pueden evitarse.

En este caso, sin embargo, parece que definitivamente pueden serlo.

Sugeriría usar la palabra clave as antes del molde. Que le dirá si el elenco tuvo éxito o no evitando así el conjunto de excepciones:

object someObject; 
SomeType typedObject; 

// fill someObject 

typedObject = someObject as SomeType; 

if(typedObject == null) 
{ 
    // Cast failed 
} 
+0

Uno debe combinar 'if (x es T) y = (T) x;' o 'y = x como T; if (x! = null) '. El primero también funciona con estructuras. – Dykam

1

eso es malo por dos razones.

  1. Las excepciones son lentas, hay bastante impacto en el rendimiento. No creo que tome todo un milisegundo como Matt señaló, pero son lo suficientemente lentos como para evitarlos en la operación normal.
  2. A menos que tenga una buena razón, no debería atrapar excepciones vacías. Solo estás ocultando problemas. Es mejor que un programa falle y que continúe con errores potencialmente peligrosos.

Si solo son try { } finally { } grupos, entonces todo está bien - no hay gastos generales allí. Sin embargo, try { } catch { } es potencialmente peligroso y potencialmente lento.

En cuanto a la documentación, esto es bastante bueno: http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx#Don%27tuseexceptionhandlingasmeansofreturninginformationfromamethod18

Editar: apenas se dio cuenta de que has dicho vacío captura excepciones, no captura vacías excepciones. De cualquier manera, a menos que estés lidiando con IO, probablemente quieras evitar hacerlo por el rendimiento.