高效的检查给定范围内是否存在一个数字的方法

7
考虑以下情况:
  • 我有2个常量MAXMIN

  • 我得到一个新数字x

现在要检查x是否在给定范围内,我会这样做:

if(x >= MIN && X <= MAX)
{
   //Some logic
}

我想知道是否有更好的方法来谈论效率。我知道这是一个非常简单的任务,但我只是好奇是否有更好的方法。


8
你认为除了使用>=<=进行比较之外还有更高效的方法吗?你为什么关心这个问题? - Tim Schmelter
1
有什么比两个比较和一个逻辑“与”更有效的呢?这只涉及三个原子处理器操作。在某些情况下,只会有一个操作(逻辑短路)。 - dymanoid
比较操作是最便宜的操作之一 - CPU 在硬件上实现它们,它们实际上只消耗一个指令(加上内存加载)。这绝对不可能成为性能瓶颈,因此它真的不需要更多的审查。保持简单,不要过度思考那些不是问题的问题。 - J...
@TimSchmelter 我不确定是否有比我提供的代码片段更有效的东西,我只是想知道是否有什么我忽略了这个简单的代码片段,因为它非常普遍。 - Sid
1
@dymanoid,更有效的方法是进行一次减法操作,再加上一个无操作转换和比较。请参见重复部分。然而,这很可能会被现代编译器自动优化。 - phuclv
显示剩余3条评论
2个回答

14

首先,这是一个典型的微优化案例,几乎从不会产生回报。

话虽如此,唯一的“优化”方法是,如果您事先知道其中一个比较很可能会产生false,那么将该比较放在第一位,以利用boolean short-circuit evaluation

if (x >= MIN && x <= MAX) { ... } // most efficient if x >= MIN is hardly ever true

或者
if (x <= MAX && x >= MIN) { ... } // most efficient if x <= MAX is hardly ever true

如果两者比较都是不可预测的,那么我们所有人都浪费了时间...


你的注释不应该相反吗,像这样: if (x >= MIN && x <= MAX) { ... } // 如果 x >= MIN 大多数情况下为真,则最有效 这样它就可以在第一次比较中通过,而无需评估逻辑 And 运算符。 - Mrinal Kamboj
不,您的推理完全相反。在 && 中,false 会导致短路:false && whatever == false - Peter B
你正在强调效率,但是第一个布尔比较为false时,数字不在范围内,但实际上这可能无法满足OP的要求,他可能希望处理范围内的值的逻辑。因此,在理论上你是正确的,我之前错了,但实际上上述两种实现都具有效率,差别不大。 - Mrinal Kamboj
这不是优化的唯一方式,请参见重复内容。此外,您可以使用__builtin_expect来指示应采取哪个分支,而不是手动组织比较。 - phuclv

4

如果您知道最小值将为0(您想排除所有负数),则可以将if语句简化为

if (max <= (uint)x)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接