【问题标题】:SWITCH STATEMENT versus IF ELSE IF STATEMENT in C++C++ 中的 SWITCH 语句与 IF ELSE IF 语句
【发布时间】:2012-04-25 15:47:54
【问题描述】:

我在这里有技术上的疑惑,switch 语句执行得更快,我知道这一点

但我想知道的是它如何比 if & else if 执行得更快?

如何直接在所有case中找到controlExpression合适的case?

如果我认为它是使用 if else if 编写的,如果它自己运行并找到合适的情况,所以它不应该执行得更快,它会执行与 if else if 相同的性能吗?

你能回答我吗?在此先感谢

【问题讨论】:

  • 使用哪种语言?它也可能因编译器而异。但是一般的想法是在选项中构建一个二叉搜索树(您可以通过有效地对 IF 进行排序来复制),或者是范围检查,然后是跳转表查找以找到它想要的代码,甚至是初始代码查找以将索引与常见实现相结合,然后从中查找跳转表,等等。这一切都表明您在实践中不太可能看到 switch 和 ifs 之间的任何显着差异。

标签: switch-statement case if-statement


【解决方案1】:

switch 语句基本上对每种情况执行相同类型的比较:var == avar == bvar == c 等。

This page has details of how that's translated into assembly by a compiler,但基本上有三种“种类”的 switch 语句:

  1. switch 具有连续 case 整数的语句 - 例如 case 3: ... case 4: ... case 5: ...。在这些情况下,编译器可以创建一个跳转表——在一个连续的内存块中跳转到的地址列表,并且只计算偏移量、找到地址并跳转。这可能比if-else if 类型的链更快。 (当然,如果只有一种情况,会有点慢。)
  2. switch 带有看似随机的case 整数的语句 - 例如case 12: ... case 106: ... case 9: ...。在这些情况下,编译器只会构建一个if-else if 链,因此它不会比if-else if 类型的代码快。
  3. switch 声明有很多看似随机的 case 整数 - 如果有一个重要的数字,一些编译器将为所有情况构建一个二叉搜索树,所以你有 O(log(n)) 时间执行任何特定的分支,这应该可以提高代码的性能。 (这取决于您正在编译的架构,因为检查您应该遵循树的哪个分支或现在是否应该跳转会产生额外的开销。)

在这种情况下,有时您可以比编译器更聪明:如果您知道您的情况只能通过某些等式匹配,例如 3x+5,那么您可以构建一个函数指针数组,计算索引 (@987654339 @),然后执行Continuation-Passing Style(或者如果你想让人们发疯,做同样的计算并建立一个goto标签数组,然后跳转意大利面条式。无论哪种方式你都会得到最佳的具有O(1) 分支时间的“连续案例”式程序集。

【讨论】:

  • 谢谢兄弟 :) 我现在明白了,非常感谢知识分享