Какой из них быстрее? Вызов функции или условный оператор if?

Пожалуйста, учтите прогноз ветвления, прежде чем отвечать на этот вопрос.

У меня есть несколько сценариев, где я могу заменить условный оператор вызовом функции с помощью указателя на функцию. Что-то вроде этого. (вы можете думать о компонентно-ориентированном программировании, а не о наследовании для аналогичного типа senario)

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

Один и тот же класс может быть написан так.

       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();
        } 
     }

Если вы рассматриваете вышеупомянутые случаи, то оба достигают одинаковых результатов. Но я думаю о снижении производительности. Во втором случае я избегаю проблем с предсказанием ветвлений с помощью вызова функции.

Теперь дайте мне знать, что является лучшей практикой и «лучше оптимизированным кодом» в этом типе senarios. (Кстати, мне не нравится утверждение «Предварительно зрелая оптимизация - корень всего зла», поскольку оптимизация имеет свои преимущества, поэтому я подумайте об оптимизации моего кода!)

П.С .: Я не против, если кто-нибудь даст подробный обзор о том, «как плохое предсказание ветвления может быть» даже в коде сборки.

Обновление: после профилирования (аналогичный приведенный выше код),
Если Условие преуспело в этом виде senario. Может ли кто-нибудь объяснить причину этого? Функциональный код вызова может быть предварительно выбран, так как не существует ответвительного кода, верно? Но здесь все выглядит иначе ... разветвленный код выигрывает! : O Профилировано на Intel Mac Osx, GCC O3 / Os оптимизация.

Ответы на вопрос(3)

Ваш ответ на вопрос