最佳答案
摘要:
我在寻找最快的计算方法
(int) x / (int) y
我只想要一个任意的结果。
背景:
在编写图像处理算法时,我经常需要除以(累积的) alpha 值。最简单的变体是带整数算术的普通 C 代码。我的问题是,对于使用 alpha==0
的结果像素,我通常会得到一个除以零的误差。然而,这正是结果完全不重要的像素: 我不关心像素的颜色值与 alpha==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。