我一直在深入研究Linux内核的某些部分,发现了如下调用:
如果(不太可能(fd<;0))
{
/*做点什么*/
}
或
如果(可能(!err))
{
/*做点什么*/
}
我找到了它们的定义:
#定义可能的(x)uu内置期望((x),1)
#定义不可能的(x)\内置的\u预期((x),0)
我知道它们是用于优化的,但是它们是如何工作的呢?使用它们可以减少多少性能/大小?至少在瓶颈代码中(当然是在用户空间中),这样做值得吗(并且可能会失去可移植性)
它们提示编译器发出指令,使分支预测偏向跳转指令的“可能”端。这可能是一个巨大的胜利,如果预测是正确的,这意味着跳转指令基本上是免费的,将需要零个周期。另一方面,如果预测是错误的,则意味着需要刷新处理器管道,这可能需要花费几个周期。只要预测在大多数情况下是正确的,这将有助于提高性能
像所有这样的性能优化一样,您应该只在广泛的评测之后进行,以确保代码确实处于瓶颈,并且可能考虑到它的微观性质,即它是在一个紧密的循环中运行的。一般来说,Linux开发人员都很有经验,所以我想他们会这么做的。他们实际上并不太关心可移植性,因为他们只针对gcc,而且他们对希望它生成的程序集有着非常接近的想法