我有一段代码可以执行很多,我想优化。它看起来像这样:
int exponent;
uint32_t mantissa;
if (exponent < 0) {
return mantissa << -exponent;
} else {
return mantissa >> exponent;
}
目的非常明确,它应该mantissa
在exponent
个地方右转,其中exponent
可能是负数。
是否有更快的方法对此进行编码(如果可能,没有分支)?
答案 0 :(得分:4)
当然有。也就是说,一个没有分支的;我不会说它在所有情况下都必须更快。
int exponent;
uint32_t mantissa;
return (uint32_t)( (uint64_t)mantissa << (32-exponent) >> 32 );
答案 1 :(得分:0)
看看这个"integer abs without branching"。这家伙有一套很棒的技巧,包括你想要的。在你的情况下似乎'sizeof(int)* CHAR_BIT'应该用8代替,如果'exponent'变量类型永远不会改变。
顺便说一下,你确定这个特定的'if'声明是由于分支引起的性能问题吗?我的意思是,如果问题在于其他地方的数据位置不佳,那么优化掉分支是没有意义的。