No puedo hablar de D ni de ninguno de sus compiladores, pero puedo contarte algo sobre C++, Windows y el compilador de Visual Studio. Esto podría ayudarlo a comprender más o menos cómo D hace las cosas.
Primero, el manejo de excepciones en máquinas de 32 y 64 bits es diferente. El x86 ABI (prolog/epilog, unwinding, llamada convención) es más laxo, por lo que el compilador y el programa en sí deben hacer más trabajo. El x86-64 ABI es más estricto y el sistema operativo desempeña un papel más importante, por lo que es más fácil para el programa trabajar con excepciones. Si está ejecutando D en Windows, probablemente use SEH (manejo de excepciones estructurado) como lo hace C++.
Una vez más, todas mis respuestas a continuación se refieren a Windows, C++ y Visual Studio.
¿Qué ocurre si escribo sin excepción el manejo del código ?
x86/x86-64: No hay ningún costo para ese método.
¿Qué pasa si lo hago, pero no hay excepciones son alguna vez arrojado?
x86: Hay un costo incluso cuando no se lanzan excepciones. La información de manejo de excepciones se envía al TIB (bloque de información de subprocesos), como el alcance inicial y el manejador de excepciones específico de la función. Para saber qué objetos destruir y qué manejadores buscar, se mantiene una variable de ámbito. Esta variable de ámbito se actualiza cuando ingresa los bloques try
y construye objetos de pila que tienen destructores.
x86-64: Debido a las reglas más estrictas, no hay un código adicional (o muy, muy mínimo). Esta es una gran ventaja sobre x86.
¿Qué sucede si lo hago, y la excepción es arrojado?
En x86 o x86-64, definitivamente habrá un golpe. Las excepciones deben ser excepcionales, aunque. No los use para un flujo de control regular. Úselos únicamente para señalar eventos realmente excepcionales e inesperados. Básicamente, nunca debe preocuparse por el costo de las excepciones. Incluso si tomaran 2 segundos, no debería importarte, porque solo deberían suceder cuando todo vaya hacia el sur de todos modos.
Dicho esto, arrojar excepciones en x86-64 es más costoso que tirarlas en x86. La arquitectura x86-64 se optimiza en el caso de que no se generen excepciones, lo que, idealmente, es casi todo el tiempo.
El panorama:
- no puedo ver los códigos de error que se propagan a ser materialmente más rápido que el manejo de excepciones, especialmente en plataformas x64.
- Dudo que alguna vez encuentre que el manejo de excepciones es un problema a menos que abuse de excepciones.
- Si no está seguro, debe medir el rendimiento de su código.
+1 para la última parte especialmente – delnan
Excelente respuesta para el caso general. También diría que si escribir código de detección de excepciones ralentiza el desarrollo, antes se estaba yendo demasiado rápido, y si los estudios "casi todos" desactivan el manejo de excepciones, se disparan a sí mismos en el pie. Podría decirse que los proyectos a gran escala pueden beneficiarse más que los pequeños del código de excepción. De hecho, Fallout 3 acerca del tiempo de lanzamiento me vino a la mente, si recuerdo que el juego parecía usar grandes excepciones, desafortunadamente simplemente no las manejaban todas. – Tim
¡Hola, Chris! ¿Podría, por favor, recomendar algún libro con una descripción detallada del problema? –