2012-01-15 12 views
6

Recuerdo haber leído en línea en alguna parte que en situaciones de latencia EXTREMADAMENTE baja, es mejor usar funciones virtuales como sustituto de las declaraciones IF.¿Usar funciones virtuales en lugar de IF es más rápido?

¿Es esto cierto? ¿Básicamente dicen que el polimorfismo dinámico es mejor para situaciones de velocidad?

¿Algún usuario tiene alguna otra "rareza" de baja latencia en C++ que pueda compartir?

+1

Creo que depende de un montón de factores, incluyendo al menos cuántos 'si' están en cascada. Considere el caso de un compilador y un [Patrón de visitante] (http://en.wikipedia.org/wiki/Visitor_pattern) para cada nodo en el AST. Por supuesto, el uso de tales patrones puede conducir a otras características menos deseables, como extender el código en un montón de clases. –

+5

Como un buen neumático, necesita una cosa sobre todo: Perfil, perfil, perfil. –

+0

Creo que esto dependerá en gran medida del código exacto y la única respuesta real es cronometrarlo unos mil millones de veces y ver cuál es la diferencia. –

Respuesta

7

Tengo muchas dudas de que una sola instrucción if/else sea más lenta que usar una función virtual: la función virtual normalmente impone un bloqueo de canalización y limita las oportunidades de optimización. Una sentencia if puede detener la canalización, pero si a menudo se ejecuta, la predicción puede ir por el camino correcto. Sin embargo, si su alternativa es entre una cascada de unas pocas sentencias if/else versus una sola llamada de función virtual, esta última puede ser más rápida. Además, si el código total que se está ejecutando mediante el uso de funciones virtuales frente a las ramas es diferente, las funciones terminan siendo sustancialmente más pequeñas, lo que puede causar pocos errores de caché en la memoria caché de instrucciones. Es decir, depende de la situación. La mejor forma es medir. Tenga en cuenta que la medición del código artificial que solo está tratando de investigar la diferencia entre dos enfoques, pero que realmente no procesa, produce resultados engañosos. Sin embargo, cuando necesita producir un código de latencia muy bajo, normalmente puede dedicar más tiempo a generarlo, es decir, puede ser viable experimentar con múltiples enfoques diferentes.

Aunque mis colegas tienden a desaprobar los enfoques de mi plantilla para evitar la ramificación en tiempo de ejecución, el código que termino a menudo es muy lento de compilar pero muy rápido de ejecutar. Por supuesto, esto depende de las funciones o ramas que se utilizan para conocerse en tiempo de compilación. En las áreas que he usado, p. Ej. para el procesamiento de mensajes a menudo es suficiente tener una decisión dinámica, p. uno para cada mensaje (es decir, una llamada de función virtual), seguido de un procesamiento que no implica ningún tipo dinámico (esto todavía son condicionales, por ejemplo, para la cantidad de valores en una tabla).

+0

Tenga en cuenta algunos procesadores También intentamos predecir ramas indirectas (la familia AMD 15H tiene una tabla de 512 entradas, por ejemplo), lo que aumenta la importancia del consejo "medir y medir en contexto". – AProgrammer

Cuestiones relacionadas