【问题标题】:Go switch string efficiencyGo 切换字符串效率
【发布时间】:2015-06-16 10:56:16
【问题描述】:

你好 Go switch string 只是一种方便的形式,但不是最快的实现?

switch s{
case "alpha": doalpha()
case "betta": dobetta()
case "gamma": dogamma()
default: dodefault()

这是否等于:

if s=="alpha"{
  doalpha()
} else if s == "betta" {
  dobetta()
} else if s == "gamma" {
  dogamma()
} else {
dodefault()
}

【问题讨论】:

标签: string performance go switch-statement


【解决方案1】:

您必须对其进行基准测试,以了解您的案例的实际差异。这取决于编译器及其所做的优化,因此也取决于平台和架构。

但请参阅link from the Go mailing list 了解有关 switch 语句实现的一些细节:

具体实现如下。

  1. 按顺序,所有非常量用例都按照 if-elses 进行编译和测试。
  2. 大于 3 个常数案例的组被二元分治。
  3. 线性比较 3 个或更少的案例。

因此,基于此,应该几乎没有差异。 switch 语句当然看起来更干净。写更长的 if-else 语句是 recommend way

因此,编写 if-else-if-else 是可能的,而且是惯用的 链作为开关。

【讨论】:

    【解决方案2】:

    在 Go 中,具有 4 个或更多 case 的常量表达式 switch 被实现为 binary search

    在编译时对案例进行排序,然后进行二进制搜索。

    this small benchmark 中,我们可以看到只有5 个案例switch 平均比相应的if-then-else 快1.5 倍 序列。一般来说,我们可以假设 O(logN) 与 O(N) 的性能差异。

    3 个较少的情况是线性比较的,因此期望与 if-then-else 的性能相同。

    【讨论】:

      猜你喜欢
      • 2017-08-13
      • 1970-01-01
      • 2017-02-19
      • 2014-08-06
      • 2021-12-07
      • 1970-01-01
      • 2023-02-24
      • 2020-01-21
      • 2011-10-21
      相关资源
      最近更新 更多