【问题标题】:Efficent way to check if a number is in a given range [duplicate]检查数字是否在给定范围内的有效方法[重复]
【发布时间】:2017-03-28 00:35:11
【问题描述】:

考虑以下场景:

  • 我有 2 个常量 MAXMIN

  • 我得到一个新号码x

现在要检查 x 是否在给定的愤怒中,我会做这样的事情:

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

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

【问题讨论】:

  • 为什么您认为有比简单地与&gt;=&lt;= 进行比较更有效的方法?为什么你在乎呢?
  • 有什么比两次比较和一个逻辑“与”更有效的呢?这些只是三个原子处理器 OP。在某些情况下,只有一个 OP(逻辑短路)。
  • 比较操作是最便宜的——CPU 在硬件中实现它们,它们实际上只消耗一条指令(加上内存负载)。这不可能成为性能瓶颈,所以它真的不经受更多的审查。保持简单,不要想太多不是问题的问题。
  • 您是否面临该代码的性能问题?
  • @dymanoid 更有效的方法是单次减法以及无操作转换和比较。见副本。然而,这很可能是现代编译器自动优化的

标签: c# algorithm


【解决方案1】:

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

if (max <= (uint)x)

【讨论】:

    【解决方案2】:

    首先,这是一个典型的微优化案例,几乎没有回报。

    话虽如此,“优化”这一点的唯一方法是,如果您事先知道其中一个比较极有可能产生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
    

    如果这两种比较都无法预测,那么我们都在浪费时间......

    【讨论】:

    • 你的 cmets 不应该相反,比如:if (x &gt;= MIN &amp;&amp; x &lt;= MAX) { ... } // most efficient if x &gt;= MIN is mostly true 所以,它通过第一次比较本身并且不需要评估逻辑 And 运算符
    • 不,你的推理完全相反。错误导致&amp;&amp;:false &amp;&amp; whatever == false短路。
    • 您指的是效率,当数字不在范围内时,凭借第一个布尔比较为假,但实际上可能不符合 OP 的要求,谁可能想要处理逻辑范围内的值。所以是的,理论上你是对的,我之前错了,但实际上上述两种实现都会有效率,差别不大。
    • 这不是优化它的唯一方法,请看副本。此外,您可以使用__builtin_expect 指示要采用哪个分支,而不是像那样手动组织比较
    猜你喜欢
    • 2017-05-16
    • 1970-01-01
    • 2018-10-29
    • 2021-04-01
    • 2013-09-14
    • 2014-12-05
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    相关资源
    最近更新 更多