哪一个更快?函数调用或条件if语句?

Ayy*_*ppa 6 c++ architecture optimization compiler-optimization data-oriented-design

在回答这个问题之前,请考虑分支预测.

我有一些场景,我可以在函数指针的帮助下用函数调用替换条件语句.这样的事情.(对于类似类型的senario,您可以考虑基于组件的编程而不是继承)

     class Shape
     {
        float Area()
        {
            if(type == SQUARE)
             {
                return length*length;
             }
            else if(type == RECTANGLE)
            {
             return length*breadth;
            }
        } 
     }
Run Code Online (Sandbox Code Playgroud)

同一个类可以这样写.

       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();
        } 
     }
Run Code Online (Sandbox Code Playgroud)

如果考虑上述情况,两者都会得到相同的结果.但是,我正在考虑性能开销.在第二种情况下,我通过函数调用避免了分支预测问题.

现在让我知道哪种更好的做法和"更优化的代码"在这种情况下.(顺便说一句,我不喜欢"早熟优化是万恶之源"的说法,因为优化有其优点所以我考虑优化我的代码!)

PS:我不介意是否有人详细介绍了即使在汇编代码中"分支预测有多糟糕".

更新:分析后(类似上面的代码),
如果条件成功在这种senario.Can任何人给出一个理由?功能调用代码可以预取,因为没有分支代码吗?但在这里它看起来是另一种方式..分支代码获胜!:O简介英特尔Mac Osx,GCC O3/Os优化.

Lio*_*gan 10

您使用间接替换了if语句.

你的if语句和间接都需要内存访问.

但是,if将导致短跳转 - 这可能不会使管道无效,而间接可能导致管道无效.

另一方面,间接是跳转,而if语句是条件跳转.分支预测器可能会错过.

没有测试它很难说哪个更快.我预测if语句会赢.

请分享你的结果!

  • 无条件跳转始终可以“预测”并且可以预取代码。对于条件跳转来说,只是概率性的。新架构的可能性会变得更好。最近情况变得相当复杂。例如,请参阅http://www.bit-tech.net/hardware/cpus/2008/11/03/intel-core-i7-nehalem-architecture-dive/5。 (2认同)