在回答这个问题之前,请考虑分支预测。
我有一些场景,可以通过使用函数指针来替换条件语句并调用一个函数。可以将其类比于基于组件的编程代替继承的情况。
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();
}
}
如果你考虑上述情况,两种方法都可以达到相同的结果。但是,我在思考性能开销。在第二种情况下,通过进行函数调用来避免分支预测问题。
现在,请告诉我哪种做法更好,并且在这种情况下进行“更好的优化代码”(顺便说一句,“过早优化是万恶之源”的说法我不喜欢,因为优化有其好处,所以我确实考虑优化我的代码!)
附言:如果有人想详细了解“分支预测有多糟糕”,即使在汇编代码中,我也不介意。
更新:在对类似于上述代码的情况进行性能测试后,如果条件成功,则此类情况将获得成功。有人可以给出原因吗?
功能调用代码可以预取,因为没有分支代码,对吧?但是在这里,情况正好相反。分支代码胜利了!:O 在Intel Mac Osx、GCC O3/Os优化中进行了测试。