【问题标题】:Is switch just as bad as if?switch 和 if 一样糟糕吗?
【发布时间】:2013-05-29 06:29:42
【问题描述】:

我在 StackOverflow 上看到使用

if(someCondition)
{
    someCode();
}
else
{
    alternateCode();
}

可能由于容易发生分支错误预测而效率低下(例如,请参阅this question)。

switch-construct 也是如此,例如,

switch (someCondition)
{
    case (someCase):
        something();
        break;
    case (otherCase):
        someOtherInstructions();
        break;
    default:
        defaultAction();
        break;
}

在这方面有什么不同(除了我已经考虑了三种可能性)?

【问题讨论】:

  • 这是一个非常罕见的“昂贵”定义!这有点像说 0.0001 美元很贵。
  • @Gabe:一如既往,这取决于应用程序。如果您需要花费 0.0001 美元数十亿次,这确实很重要(尽管我同意这几乎不是成本的主要部分)。
  • 我更喜欢 case 语句,因为它们更容易阅读并减少程序员出现逻辑错误的机会。不知道实际执行的效率是否有差异。
  • 相关(可能是 Java 特定的):stackoverflow.com/questions/2086529/…
  • 相关(可能是 C++ 特定):stackoverflow.com/questions/97987/…

标签: performance optimization language-agnostic compiler-optimization branch-prediction


【解决方案1】:

if 语句并不“昂贵”,可能是条件分支。问题不在于您选择编写许多不同的高级语句中的哪一个 - if、@ 987654324@、forwhile。问题是现代计算机在执行无条件指令路径时工作得非常好,但是当有一个决策点时,它们可能会减慢速度。由于没有决策点(,条件分支),您无法在计算中做任何有趣的事情,因此您不妨忽略高级语言结构的选择。

【讨论】:

  • Switch 语句不一定编译为条件分支(想想跳转表)。
  • 我想这里的重点是,除非您将一段代码运行数千(或数百万)次,否则不要担心......
  • @sepp2k 同意。但这是编译器的决定,它可能取决于所涉及的特定值。无论如何,重点不是“if vs. switch”,而是“条件分支预测”。
猜你喜欢
  • 2022-12-22
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
  • 2018-08-06
  • 2014-09-07
相关资源
最近更新 更多