用已知值集确定整数是否在两个整数(包括两个整数)之间的最快方法

j

有没有比x >= start && x <= endC或C ++更快的方法来测试整数是否在两个整数之间?

更新:我的特定平台是iOS。这是框模糊功能的一部分,该功能将像素限制为给定正方形中的圆形。

更新:在尝试了可接受的答案之后,我在一行代码上以正常x >= start && x <= end方式完成了一个数量级的加速

更新:这是来自XCode的汇编程序的前后代码:

新方法

// diff = (end - start) + 1
#define POINT_IN_RANGE_AND_INCREMENT(p, range) ((p++ - range.start) < range.diff)

Ltmp1313:
 ldr    r0, [sp, #176] @ 4-byte Reload
 ldr    r1, [sp, #164] @ 4-byte Reload
 ldr    r0, [r0]
 ldr    r1, [r1]
 sub.w  r0, r9, r0
 cmp    r0, r1
 blo    LBB44_30

旧路

#define POINT_IN_RANGE_AND_INCREMENT(p, range) (p <= range.end && p++ >= range.start)

Ltmp1301:
 ldr    r1, [sp, #172] @ 4-byte Reload
 ldr    r1, [r1]
 cmp    r0, r1
 bls    LBB44_32
 mov    r6, r0
 b      LBB44_33
LBB44_32:
 ldr    r1, [sp, #188] @ 4-byte Reload
 adds   r6, r0, #1
Ltmp1302:
 ldr    r1, [r1]
 cmp    r0, r1
 bhs    LBB44_36

令人惊讶的是,减少或消除分支可以提供如此惊人的速度。

杰里·科芬

只有一个比较/分支才能做到这一点。能否真正提高速度可能尚有待商question,即使这样做,也可能很少引起注意或关注,但是当您仅从两个比较开始时,进行巨大改进的机会就很少了。代码如下:

// use a < for an inclusive lower bound and exclusive upper bound
// use <= for an inclusive lower bound and inclusive upper bound
// alternatively, if the upper bound is inclusive and you can pre-calculate
//  upper-lower, simply add + 1 to upper-lower and use the < operator.
    if ((unsigned)(number-lower) <= (upper-lower))
        in_range(number);

对于典型的现代计算机(即任何使用二进制补码的计算机),向无符号的转换实际上是一个小问题-只是查看相同位的方式发生了变化。

请注意,在典型情况下,您可以upper-lower在(假定的)循环之外进行预计算,因此通常不会花费大量时间。除了减少分支指令的数量之外,这还(通常)改善了分支预测。在这种情况下,无论数字是在范围的底端之下还是在范围的顶端之上,都将采用相同的分支。

关于这是如何工作的,基本思想非常简单:负数,当被视为无符号数时,将大于任何以正数开头的东西。

在实践中,此方法会将number区间转换为原点,并检查number区间是否在[0, D]哪里D = upper - lower如果number低于下限:,如果高于上限:大于D

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章