Me encontré con este ejemplo recientemente:
Si 999 de cada 1,000 veces no se lanzará una excepción, la excepción solo se genera una vez. Por otro lado, un condicional se habría llamado innecesariamente 999 veces, por lo tanto, en este caso, la excepción es superior.
En este caso, es C #, pero, en general, ¿es esto cierto? Anteriormente había asumido que las declaraciones try / catch tenían sus propios gastos generales que equivaldrían al tiempo dedicado a manejar un condicional.
Por supuesto, solo lanzar bloques try / catch en cualquier lugar donde normalmente iría un condicional sería una forma terrible de codificar, pero en términos de recursos, ¿esta afirmación se mantiene?
design
object-oriented
Jane Panda
fuente
fuente
Respuestas:
En general, es cierto para los compiladores de calidad comercial. Sin embargo, los condicionales pueden lograr eficiencias similares utilizando
assume(false)
anotaciones de estilo. La optimización guiada por perfil puede vencer a ambos.La razón subyacente es que los buenos compiladores pueden generar código más eficiente haciendo suposiciones correctas sobre la probabilidad de que se ejecute el código. Dado que la convención es que las excepciones son excepcionales, la mayoría de los compiladores (en ausencia de datos de generación de perfiles) generarán un código óptimo cuando las excepciones son realmente raras.
Por ejemplo, el código de manejo de excepciones se puede colocar en su propio segmento, y solo se paginará cuando ocurra la primera excepción. Esto significa que el caché de la CPU se puede usar de manera más eficiente, almacenando solo código no excepcional.
fuente
Hay escenarios para usar try / catch y otros para usar condicionales.
El uso de un try / catch no daña el rendimiento como se describe ampliamente aquí
Más allá del rendimiento, el manejo adecuado de excepciones es importante. Lo último que desea es que se muestren los errores no detectados a un usuario, el rendimiento defectuoso o la aplicación que se cuelga después de que se encuentra un problema.
fuente
Un ejemplo de un mejor rendimiento usando try / catch en lugar de un condicional es cuando se trata de diccionarios, cuando se pregunta si contiene la clave es O (n) en lugar de solo intentar acceder / agregar la clave y detectar la posible excepción.
fuente