摘要:
我正在寻找最快的计算方法。
(int) x / (int) y
不希望在y==0
时出现异常,而只想要一个任意的结果。
result = (y==0)? 0 : x/y;
或者result = x / MAX( y, 1 );
x和y是正整数。由于代码在嵌套循环中执行了大量次数,因此我正在寻找一种消除条件分支的方法。
当y不超过字节范围时,我对解决方案感到满意。
unsigned char kill_zero_table[256] = { 1, 1, 2, 3, 4, 5, 6, 7, [...] 255 };
[...]
result = x / kill_zero_table[y];
但是,这显然对于更大的范围不起作用。
我猜最终的问题是:在保留所有其他值不变的情况下,将0更改为任何其他整数值的最快位操作技巧是什么?
澄清
我不确定分支是否太昂贵。 但是,使用不同的编译器进行基准测试,因此我更喜欢使用少量优化(确实是有问题的)。
当涉及位操作时,编译器确实非常好,但我无法在C中表示“不关心”的结果,因此编译器永远无法使用全部优化范围。
代码应完全兼容C,主要平台是Linux 64位与gcc和clang以及MacOS。
y += !y
吗?不需要分支来计算。你可以将x / (y + !y)
与x / max(y, 1)
进行比较,也许还有y ? (x/y) : 0
。我猜在启用优化的情况下,它们都不会有分支。 - leemes0
部分非常巨大而且是连续的,那么现代分支预测是可接受的。微小优化确实有其应用场景,而针对每个像素的操作正是这样一个场景。 - Yakk - Adam Nevraumont