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语句会赢.
请分享你的结果!
| 归档时间: |
|
| 查看次数: |
5367 次 |
| 最近记录: |