Прежде чем ответить на этот вопрос, рассмотрите также предсказание ветвления.
У меня есть несколько сценариев, в которых я могу заменить условный оператор вызовом функции с помощью указателя функции. Что-то вроде этого. (вы можете думать о программировании на основе компонентов вместо наследования для аналогичного типа 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();
}
}
ЕСЛИ вы рассматриваете приведенные выше случаи, оба достигают одинаковых результатов. Но я думаю о накладных расходах на производительность. Во втором случае я избегаю проблемы прогнозирования ветвления, вызывая функцию.
Теперь дайте мне знать, что является лучшей практикой и «лучше оптимизированным кодом» в такого рода сценариях. рассмотрите возможность оптимизации моего кода!)
P.S: Я не возражаю, если кто-нибудь даст подробный обзор того, «насколько плохим может быть предсказание ветвления» даже в ассемблерном коде.
Обновление: после профилирования (похожий вид кода выше),
Если условие преуспело в этом виде senario. Может ли кто-нибудь объяснить причину этого? Функциональный код вызова может быть предварительно загружен, так как нет кода ветвления, верно? Но здесь все выглядит иначе... Ветвящийся код выигрывает! :O Профиль для Intel Mac Osx, оптимизация GCC O3/Os.