摘要:
我在寻找最快的计算方法
(int) x / (int) y
而不会得到y==0
的异常。相反,我只想要一个任意的结果。
背景:
在编写图像处理算法的代码时,我经常需要除以(累积的) 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为任何其他整数值,而所有其他值保持不变?
Clarifications
我不是百分之百确定分支是否太昂贵。但是,由于使用了不同的编译器,所以我更喜欢进行少量优化的基准测试(这确实是有问题的)。
当然,当涉及到位旋转时,编译器是很棒的,但是我不能用C来表达“无关”的结果,所以编译器永远不能使用所有的优化。
代码应该是完全兼容C语言的,主要的平台是64位的Linux64位的gcc和clang和MacOS。
https://stackoverflow.com/questions/16777456
复制相似问题