2010-08-13 15 views
6

Duplicar posibles:
Performance Cost Of ‘try’costo de rendimiento de un bloque try/catch

estoy siendo dicho que la adición de un bloque intento de captura se suma importante costo de rendimiento en el orden de 1000 veces más lento que sin, en el ejemplo de un bucle for de un millón. ¿Es esto cierto?

¿No es mejor usar try catch block tanto como sea posible?

+0

http://stackoverflow.com/questions/164613/why-are-try-blocks-expensive http://stackoverflow.com/questions/2075151/try-catch-blocks-always-expensive-closed – Greg

+2

Duplicado [ muchas, muchas veces más) (http://stackoverflow.com/search?q= [c% 23] + exception + performance). Busque primero, por favor. –

+2

probablemente el * mejor * duplicado de ellos: http://stackoverflow.com/questions/1308432/do-try-catch-blocks-hurt-performance-when-exceptions-are-not-thrown – x4u

Respuesta

27

De MSDN site:

encontrar y diseñar distancia código de excepción-pesado puede resultar en una victoria Potencia decente . Tenga en cuenta que esto no tiene nada que ver con los bloques try/catch : solo incurre en el costo cuando se produce la excepción real. Usted puede usar tantos bloques try/catch como que desee. Usar excepciones gratuitamente es donde pierde rendimiento. Por ejemplo, debe mantenerse alejado de cosas como usar excepciones para el flujo de control.

ver también estas preguntas relacionadas SO: (1)(2)(3) y (4).

0

estoy siendo dicho que la adición de un bloque intento de captura añade mayor rendimiento costo del orden de 1000 veces más lento que sin , en el ejemplo de un bucle de de un millón. ¿Es esto cierto?

El uso de try catch agrega un costo de rendimiento, pero no representa un costo de rendimiento importante.

¿No es mejor usar try catch block tanto como sea posible?

No, lo mejor es usar el bloque try catch cuando tenga sentido.

+0

El costo de rendimiento depende del compilador que utilice. –

2

Definitivamente debe probar las afirmaciones de este tipo (bastante fácil), pero no, eso no le hará daño (tendrá un costo, pero no miles de veces).

Lanzar excepciones y manejarlas es costoso. Tener un try..catch ... por fin no está mal.

Ahora bien, dicho esto, si va a detectar una excepción, debe tener un plan para lo que va a hacer con ella. No tiene sentido atrapar si solo vas a volver a lanzar, y muchas veces, no hay mucho que puedas hacer si recibes una excepción.

8

Podría jurar que hubo una pregunta como esta hace unos días, pero no puedo encontrarla ...

Es poco probable que agregar un bloque try/catch modifique notablemente el rendimiento cuando no se lanzan excepciones, aunque puede evitar que un método se inserte. (Las diferentes versiones de CLR tienen reglas diferentes en torno a la alineación; no recuerdo los detalles.)

El gasto real se produce cuando se emite una excepción, e incluso ese gasto suele ser exagerado. Si utiliza excepciones apropiadamente (es decir, solo en situaciones de error realmente excepcionales o inesperadas), entonces es poco probable que sean un golpe de rendimiento significativo, excepto en los casos en que su servicio está demasiado regado para considerarse "funcional".

En cuanto a si debe usar bloques de prueba/captura tanto como sea posible - ¡absolutamente no! Por lo general, solo debe detectar una excepción si realmente puede manejar , lo cual es relativamente raro. En particular, solo tragar una excepción es casi siempre lo que no debe hacer.

Escribo muchos más bloques try/finally (de hecho, casi siempre a través de using declaraciones) que try/catch blocks. Try/catch es a veces apropiado en el nivel superior de una pila, de modo que un servicio puede seguir procesando la próxima solicitud, incluso si falla, pero de lo contrario raramente capturo excepciones. A veces vale la pena detectar una excepción para envolverla en una excepción diferente, básicamente traducir la excepción en lugar de manejarla realmente.

+2

.. relativamente raro?Entonces, si abres un archivo que no existe, ¿bloqueas la aplicación? Si obtiene un bloqueo 404, la aplicación? Si convierte una cadena sin dígitos a un número, ¿se cuelga la aplicación? Yo diría que, a menos que el programa no pueda recuperarse, déjelo colapsar. Pero si puedes recuperarte, ¿no debería ser así? – Toad

+1

@Toad: si está convirtiendo una cadena en un número, debe usar TryParse si es una entrada del usuario, por un lado. Pero el punto es que la mayoría de estos deberían ser atrapados, si es que lo están, a un nivel relativamente alto. Eso es más difícil para las aplicaciones de los clientes que las aplicaciones del lado del servidor, pero tenga en cuenta las etiquetas de las preguntas: OP está hablando desde una perspectiva de ASP.NET. Por lo general, si hay una excepción, el enfoque correcto es abortar la solicitud e informar un error al usuario. ¿Cuántos bloqueos de captura requiere realmente? –

0

¿Por qué adivinar los costos de rendimiento, cuándo puede comparar y ver si es importante?

1

Agregar try catch blocks ayuda a controlar su aplicación de excepciones sobre las que no tiene control. El costo de rendimiento proviene de arrojar una excepción cuando hay otras alternativas. Por ejemplo, lanzar una excepción al rescate de una rutina en lugar de simplemente regresar de una rutina causa una cantidad significativa de sobrecarga, lo que puede ser completamente innecesario.

0

Es cierto que las excepciones son una operación muy costosa. También intente ... los bloques de captura atiborran el código y lo hacen difícil de leer. Que dichas excepciones están bien para los errores que deberían bloquear la aplicación la mayor parte del tiempo.

Siempre corro al romper en todas las excepciones, por lo que tan pronto como ocurre un error se lanza y puedo precisarlo bastante fácil. Si todo el mundo lanza excepciones todo el tiempo, obtengo un mal rendimiento y no puedo usar el descanso en todas las excepciones, eso me entristece.

IMO no utiliza la excepción para los eventos normales del programa (como los tipos de usuario en un número no determinado e intenta analizarlo como un número). Use las construcciones de flujo de programa normales para eso (es decir, si).

Si utiliza funciones que pueden arrojarlo, haga una elección. Es el error crítico => bloquear la aplicación. Es el error no crítico y probable => atraparlo (y potencialmente registrarlo).

Cuestiones relacionadas