Históricamente, en lenguajes como C++, las excepciones han sido muy lento en comparación con otra formas de control de flujo en el mismo idioma.
En C++, hay dos cosas en el trabajo:
- lanzar una excepción es muy complejo. La pila necesita ser desenrollada, y hacerlo en código nativo es mucho más difícil que en un lenguaje de VM de alto nivel.
- El control de flujo directo regular es extremadamente rápido. Es un código nativo; una bifurcación es un par de instrucciones, donde una excepción al retroceder la pila invoca un algoritmo complejo (buscar datos de la pila en una tabla grande, posiblemente comprimida, y así sucesivamente).
Esta disparidad en el rendimiento condujo a la sabiduría general detrás de las excepciones: solo hágalo para cosas inusuales, por lo que solo se usa donde sea más beneficioso y no donde afecte el rendimiento.
Esto no se aplica a los idiomas de alto nivel. Esto también se debe a dos razones:
- Revertir la pila es mucho, mucho más simple.La pila es muy fácil de examinar; no necesita tablas mágicas para saber hasta qué punto revertir la pila y qué objetos se construyen en un momento dado.
- El flujo de programa regular es inherentemente más lento. En un lenguaje basado en VM, todo simplemente requiere más trabajo para empezar.
Las excepciones aún no son gratuitas, pero la disparidad ya no es algo de lo que preocuparse. Esto significa que la sabiduría general formada en C++ se aplica mal aquí. Las excepciones se usan regularmente en el flujo normal del programa.
De hecho, están integrados en el lenguaje, en construcciones que utiliza todo el tiempo. Cada vez que utiliza un iterador, cada for x in xrange(1000)
, se utiliza una excepción StopIteration
para finalizar el ciclo.
Elija excepciones o control de flujo lineal en Python en función del cual tenga más sentido. No elija en función del rendimiento, a menos que se encuentre en un bucle interno donde el rendimiento importa; en ese caso, como siempre, haga un perfil y descubra si realmente importa.
(no puedo hablar por PHP.)
C++ es similar a PHP en lo que respecta a las excepciones (al menos para las aplicaciones de escritorio; las incrustadas pueden ser diferentes) - las excepciones generadas ** realmente ** perjudican su rendimiento. – Zooba
El rendimiento de C# también se degrada gravemente cuando se lanzan excepciones. –
Acabo de dar cuenta de que escribí "excepción de la norma". Por favor, no lo tome como un mal juego de palabras X-P – keithjgrant