¿Los punteros de función hacen que se borre una línea de instrucciones?
Las CPU modernas tienen una amplia canalización, es decir, están cargando las instrucciones y los datos necesarios mucho antes de que realmente ejecuten la instrucción.
A veces, los datos cargados en la tubería se invalidan, y la tubería se debe borrar y volver a cargar con datos nuevos. El tiempo que se tarda en rellenar la tubería puede ser considerable y provocar una desaceleración del rendimiento.
Si llamo a un puntero de función en C, ¿es la canalización lo suficientemente inteligente como para darse cuenta de que el puntero en la tubería es un puntero de función, y que debería seguir ese puntero para las siguientes instrucciones? ¿O el hecho de tener un puntero de función hará que la tubería se borre y reduzca el rendimiento?
Estoy trabajando en C, pero imagino que esto es aún más importante en C ++ donde muchas llamadas de función se realizan a través de v-tables.
editar@JensGustedt escribe:Para ser un verdadero éxito en el rendimiento de las llamadas a funciones, la función a la que llama debe ser extremadamente breve. Si observa esto midiendo su código, definitivamente debería volver a visitar su diseño para permitir que esa llamada esté en línea.
Desafortunadamente, esa puede ser la trampa en la que caí.
Escribí la función de destino pequeña y rápida por razones de rendimiento.
Pero se hace referencia a un puntero de función para que pueda ser reemplazado fácilmente por otras funciones (¡Simplemente haga que el puntero haga referencia a una función diferente!). Como me refiero a él a través de un puntero de función, no creo que pueda estar en línea.
Entonces, tengo una función extremadamente breve, no en línea.