我读到这个问题为什么处理排序数组比处理未排序数组更快?以及由神秘。答案很好地解释了正在发生的事情和原因,并说明了这一点:
那么我们能做些什么呢?
如果编译器无法将分支优化为条件移动,如果你愿意牺牲,你可以尝试一些技巧性能可读性。
替换:
if (data[c] >= 128)
sum += data[c];
带有:
int t = (data[c] - 128) >> 31;
sum += ~t & data[c];
这消除了分支,并用一些位替换它操作。
这个代码到底在做什么?为什么它是等效的?
它首先将比较转换为128的减法。
然后,结果的符号(减法是否低于128)被扩展为全零或全一,即and
被添加到要添加的值,如果减法的结果为负,则将其清零。