3

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

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

它如何直接在所有案例中找到 controlExpression 合适的案例?

如果我认为它是使用 if else if 编写的,如果它自己运行并找到合适的案例,那么它不应该执行得更快,它的性能与 if else if 相同?

所以你能回答我吗?提前致谢

4

1 回答 1

5

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

此页面详细介绍了编译器如何将其转换为程序集,但基本上有三种“类型”的 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,那么您可以构建一个函数指针数组,计算索引 ( (caseNum - 5) / 3),然后执行它继续 -传递风格(或者,如果你想让人们发疯,做同样的计算并构建一个goto标签数组,然后跳转意大利面条风格。无论哪种方式,你都会得到具有O(1)分支时间的最佳“连续案例”风格的装配。

于 2012-04-25T16:44:10.093 回答