gpt4 book ai didi

if-statement - 为什么将最可能的条件放在 `if-else` 语句中?

转载 作者:行者123 更新时间:2023-12-04 20:04:44 27 4
gpt4 key购买 nike

我经常听到这样的话,足以对此提出质疑 - 很多人说在 if-else 语句中,应该将最有可能为真的条件放在第一位。所以,如果 condition大多数时候很可能是假的,把!condition在 if 语句中,否则使用 condition .一些人为的说明我的意思:

if (likely) {
// do this
} else {
// do that
}

if (!unlikely) {
// do this
} else {
// do that
}

有人说这更有效——也许是由于分支预测或其他一些优化,我从来没有真正询问过该主题何时被破坏——但据我所知,总会有一个测试,两条路径都会导致跳跃。

所以我的问题是 - 是否有令人信服的理由(其中“令人信服的理由”可能是一个微小的效率增益)为什么最有可能为真的条件应该出现在 if-else 语句中?

最佳答案

顺序可能很重要的原因有两个:

  • 由于已知数据分布,多个 if/else_if/else_if/else 语句的多个分支具有不同的概率

  • sample - 分类苹果,大多数是黄色一次(90%),但有些是橙色(5%),有些是其他颜色(5%)。
     if (apple.isYellow) {...}
    else if (apple.isOrange) {....}
    else {...}

    对比
     if (!apple.isYellow && !apple.isOrange) {...}   
    else if (apple.isOrange ) {....}
    else {...}

    在第一个样本中,90% 的苹果只检查了一个 if 检查,10% 会检查到 2,但在第二个样本中,只有 5% 的苹果检查了一次检查,95% 的检查了两次。

    因此,如果您知道使用一个分支的机会之间存在显着差异,则将其向上移动为第一个条件可能会很有用。

    请注意,您的单例 if 样本在该级别上没有区别。
  • 可能有利于分支之一的低级 CPU 优化(这也更多地是关于传入数据以始终达到相同的条件分支)。

  • 与顺序执行代码的情况相比,如果执行条件跳转,则较早/较简单的 CPU 可能需要清除命令解析管道。因此,这可能是提出此类建议的原因。

    sample (假装):
        IF R1 > R2 JUMP ElseBranch
    ADD R2, R3 -> R4 // CPU decodes this command WHILE executing previous IF
    ....
    JUMP EndCondition
    ElseBranch:
    ADD 4, R3 -> R4 // CPU will have to decodes this command AFTER
    // and drop results of parsing ADD R2, R3 -> R4
    ....
    EndCondition:
    ....

    现代 CPU 不应该有问题,因为它们会解析两个分支的命令。他们甚至有条件的分支预测逻辑。因此,如果条件主要以一种方式解决,CPU 将假定条件将以特定方式解决,并在检查完成之前开始执行该分支中的代码。据我所知,在当前的 CPU 上,它是条件的第一分支还是替代分支并不重要。退房 Why is it faster to process a sorted array than an unsorted array?有关这方面的好信息。

    关于if-statement - 为什么将最可能的条件放在 `if-else` 语句中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27179202/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com