Какой из них быстрее? Вызов функции или условный оператор 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 оптимизация.