¿Cuál es más rápido? Llamada de función o Condicional si Declaración?

Por favor considere la predicción de la rama también antes de responder esta pregunta.

Tengo algunos escenarios en los que puedo reemplazar una declaración condicional con una llamada a una función con la ayuda del puntero de función. Algo así. (puede pensar en la programación basada en componentes sobre la herencia para un tipo similar de senario)

     class Shape
     {
        float Area()
        {
            if(type == SQUARE)
             {
                return length*length;
             }
            else if(type == RECTANGLE)
            {
             return length*breadth;
            }
        } 
     }

La misma clase se puede escribir así.

       class Shape
     {
        void SetAreaFunction(void *funcptr)//this function is used to set the current AreaFunc
        {
             CurrentAreaFunc = funcptr ;//this holds the pointer to current area func
        }
        float SqauareArea();//this will return square area
        float RectangleArea();//this will return rectangle area 
        float Area()
        {
            currentAreaFunc();
        } 
     }

Si considera los casos anteriores, ambos logran los mismos resultados. Pero estoy pensando en la sobrecarga de rendimiento. En el segundo caso, evito tener un problema de predicción de sucursal al tener una llamada a la función.

Ahora hágame saber cuál es la mejor práctica y el 'código mejor optimizado' en este tipo de senarios. (Por cierto, no me gusta la afirmación "La optimización prematura es la raíz de todo mal", ya que la optimización tiene sus beneficios, así que ¡Considero optimizar mi código!)

P.S: No me importa si alguien da una descripción detallada sobre "cuán mala puede ser la predicción de rama" incluso en el código de ensamblaje.

Update: después de la creación de perfiles (tipo similar del código anterior),
Si la condición tuvo éxito en este tipo de senario, ¿alguien puede dar una razón para esto? El código de llamada funcional se puede buscar previamente ya que no hay código de ramificación, ¿verdad? Pero aquí se ve para otro lado ... ¡el código de ramificación gana! : O Perfilado en Intel Mac Osx, optimización GCC O3 / Os.

Respuestas a la pregunta(3)

Su respuesta a la pregunta