我有一段代码会被执行很多次,我想对其进行优化。它看起来像这样:
int exponent;
uint32_t mantissa;
if (exponent < 0) {
return mantissa << -exponent;
} else {
return mantissa >> exponent;
}
mantissa
它的目的很明确,它应该按位置右移exponent
,其中exponent
可能是负数。
有没有更快的编码方法(如果可能,没有分支)?
我有一段代码会被执行很多次,我想对其进行优化。它看起来像这样:
int exponent;
uint32_t mantissa;
if (exponent < 0) {
return mantissa << -exponent;
} else {
return mantissa >> exponent;
}
mantissa
它的目的很明确,它应该按位置右移exponent
,其中exponent
可能是负数。
有没有更快的编码方法(如果可能,没有分支)?
当然有。即无分支的;我不会说它在所有情况下都一定会更快。
int exponent;
uint32_t mantissa;
return (uint32_t)( (uint64_t)mantissa << (32-exponent) >> 32 );
看看这个“没有分支的整数 abs”。这家伙有一套很棒的小技巧,包括你想要的。如果'exponent'变量类型永远不会改变,那么在你的情况下,'sizeof(int)*CHAR_BIT' 应该只替换为 8。
顺便说一句,您确定这个特定的“if”语句是由于分支导致的性能问题吗?我的意思是,如果问题在于其他地方的数据局部性差,那么优化分支是没有意义的。