¿Qué tan caros son los moldes dinámicos en C++?


Para mi API GUI, que funciona con una variedad de backends (sdl, gl, d3d, etc.), quiero convertir dinámicamente la imagen de tipo genérico en lo que sea.

Así que la conclusión es, estaría haciendo alrededor de 20 * 60fps lanzamientos dinámicos por segundo.

¿Qué tan caro es un reparto dinámico? ¿Notaré que tiene un impacto negativo notable en el rendimiento? ¿Qué alternativas tengo que aún mantienen un nivel aceptable de rendimiento?

Author: Cody Gray, 2011-04-17

4 answers

1200 dynamic_casts por segundo no es probable que sea un problema de rendimiento importante. ¿Está haciendo una dynamic_cast por imagen, o una secuencia completa de instrucciones if hasta que encuentre el tipo real?

Si te preocupa el rendimiento, las formas más rápidas de implementar el polimorfismo son:

  • --- el más rápido ---
  • Sobrecarga de funciones (solo polimorfismo en tiempo de compilación)
  • CRTP (solo polimorfismo en tiempo de compilación)
  • Etiquetas, interruptores y moldes estáticos (frágil, no es compatible con la herencia de varios niveles, un dolor de cabeza de mantenimiento por lo que no se recomienda para el código inestable)
  • Funciones virtuales
  • Patrón de visitante (función virtual invertida)
  • --- casi tan rápido ---

En su situación, el patrón de visitante es probablemente la mejor opción. Son dos llamadas virtuales en lugar de una, pero le permite mantener la implementación del algoritmo separada de la estructura de datos de la imagen.

 17
Author: Ben Voigt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-31 14:55:14

¿No puede definir su propio cast usando un #define, que usa dynamic_cast en la compilación de depuración (para que sepa que su cast es correcto) y hace un cast simple (MySubclass *) en la compilación de lanzamiento para que no haya costo de rendimiento?

 0
Author: Joris Mans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-17 15:14:44

En esta circunstancia particular, debería ser capaz de organizar su código para que el dynamic_cast solo sea necesario una vez. Me imagino que el backend no cambia dinámicamente.

 0
Author: zdan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-17 16:07:07
 0
Author: Sujay Ghosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-17 18:28:39