2010-08-28 16 views
11

En el lenguaje de programación D2, ¿cuáles son las implicaciones de rendimiento del uso de manejo de excepciones? En particular:Sobrecarga del manejo de excepciones en D

  • ¿Qué sucede si no escribo código de manejo de excepciones?
  • ¿Qué pasa si lo hago, pero nunca se lanzan excepciones?
  • ¿Qué sucede si lo hago, y se arrojan excepciones?
  • ¿El manejo de excepciones causa la pérdida de oportunidades de optimización?
  • ¿Se puede deshabilitar el manejo de excepciones como se puede hacer en muchas (¿la mayoría?) Implementaciones de C++?

Sé que casi todos los estudios de desarrollo de juegos comerciales desactivan el manejo de excepciones en su C++ debido a las implicaciones de rendimiento y el mayor tiempo de desarrollo asociado con el manejo correcto de excepciones. Sé que D hace que esto último sea menos doloroso, pero ¿y el rendimiento?

Por supuesto, probablemente se trata de una implementación definida, así que para esta pregunta, concéntrese en el compilador de DMD.

Respuesta

27

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

+1 para la última parte especialmente – delnan

+1

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

+0

¡Hola, Chris! ¿Podría, por favor, recomendar algún libro con una descripción detallada del problema? –

6

Hasta donde yo sé, DMD utiliza cualquiera que sea el mecanismo nativo de la plataforma. En Windows, esto sería Gestión de excepciones estructuradas, que es lo que MSVC++ también utiliza para implementar excepciones.

En Linux, creo que utiliza el mismo mecanismo de tablas de excepción que utiliza GCC. En otras plataformas, no sé.

En términos de rendimiento, es probablemente el mismo (o al menos muy cercano) a C++.