2

我有一段代码会被执行很多次,我想对其进行优化。它看起来像这样:

int exponent;
uint32_t mantissa;

if (exponent < 0) {
    return mantissa << -exponent;
} else {
    return mantissa >> exponent;
}

mantissa它的目的很明确,它应该按位置右移exponent,其中exponent可能是负数。

有没有更快的编码方法(如果可能,没有分支)?

4

2 回答 2

4

当然有。即无分支的;我不会说它在所有情况下都一定会更快。

int exponent;
uint32_t mantissa;

return (uint32_t)( (uint64_t)mantissa << (32-exponent) >> 32 );
于 2012-04-22T21:42:50.140 回答
0

看看这个“没有分支的整数 abs”。这家伙有一套很棒的小技巧,包括你想要的。如果'exponent'变量类型永远不会改变,那么在你的情况下,'sizeof(int)*CHAR_BIT' 应该只替换为 8。

顺便说一句,您确定这个特定的“if”语句是由于分支导致的性能问题吗?我的意思是,如果问题在于其他地方的数据局部性差,那么优化分支是没有意义的。

于 2012-04-23T08:35:02.890 回答