¿Qué tan lentas son las excepciones de .NET?
No quiero una discusión sobre cuándo y cuándo no lanzar excepciones. Deseo resolver un problema simple. El 99% de las veces, el argumento para no lanzar excepciones gira en torno a que son lentas, mientras que la otra parte afirma (con una prueba de referencia) que la velocidad no es el problema. He leído numerosos blogs, artículos y publicaciones pertenecientes a un lado o al otro. Entonces ¿cuál es?
Algunos enlaces de las respuestas: Skeet , Mariani , Brumme .
Estoy en el lado "no lento" - o más precisamente "no lo suficientemente lento como para que valga la pena evitarlos en el uso normal". He escrito dos artículos breves sobre esto. Hay críticas al aspecto de la prueba comparativa, que en su mayoría se deben a que "en la vida real habría más pila por revisar, por lo que arruinarías el caché, etc.", pero usar códigos de error para avanzar en la pila también sería volar el caché, así que no lo veo como un argumento particularmente bueno.
Solo para dejarlo claro: no apoyo el uso de excepciones que no sean lógicas. Por ejemplo, int.TryParse
es totalmente apropiado para convertir datos de un usuario. Es inapropiado cuando se lee un archivo generado por una máquina, donde falla significa "El archivo no está en el formato que debe tener, realmente no quiero tratar de manejar esto porque no sé qué más podría estar mal". "
Cuando utilizo excepciones en "circunstancias sólo razonables", nunca he visto una aplicación cuyo rendimiento se haya visto significativamente afectado por las excepciones. Básicamente, las excepciones no deberían ocurrir con frecuencia a menos que tenga problemas importantes de corrección, y si tiene problemas importantes de corrección, entonces el rendimiento no es el mayor problema al que se enfrenta.
Existe la respuesta definitiva a esto del tipo que los implementó: Chris Brumme. Escribió un excelente artículo de blog sobre el tema (advertencia: es muy largo) (advertencia2: está muy bien escrito, si eres un experto en tecnología lo leerás hasta el final y luego tendrás que recuperar tus horas después del trabajo :) )
El resumen ejecutivo: son lentos. Se implementan como excepciones de Win32 SEH, por lo que algunas incluso superarán el límite de CPU del anillo 0. Obviamente, en el mundo real, harás muchos otros trabajos, por lo que no se notará ninguna excepción, pero si los usas para el flujo del programa, espera que tu aplicación se vea afectada. Este es otro ejemplo de cómo la máquina de marketing de MS no nos hace ningún favor. Recuerdo que un microsoftie nos contó cómo no incurrieron en gastos generales, lo cual es una completa tontería.
Chris da una cita pertinente:
De hecho, el CLR utiliza excepciones internamente incluso en las partes no administradas del motor. Sin embargo, existe un problema grave de rendimiento a largo plazo, con excepciones, y esto debe tenerse en cuenta a la hora de tomar una decisión.