哪个在ruby中更快 - 哈希查找或带有case语句的函数?

Sim*_*mon 13 ruby performance

我们在一个时间要求严格的脚本中有几个地方,我们将旧ID转换为字符串.目前,我们在函数中使用case语句,如下所示:

def get_name id
  case id
    when 1
      "one thing"
    when 3
      "other thing"
    else
      "default thing"
  end
end
Run Code Online (Sandbox Code Playgroud)

我正在考虑用哈希查找替换它,如下所示:

NAMES = {
  1 => "one thing",
  3 => "other thing",
}
NAMES.default = "default thing"
Run Code Online (Sandbox Code Playgroud)

这感觉就像它应该是更快地使用NAMES[id]get_name(id)-但果真如此吗?

Bil*_*ber 30

先说几点.一个是像这样的低级语言构造,或多或少做同样的事情几乎从来不是任何现实世界应用程序的瓶颈,所以专注于它们(通常)是愚蠢的.其次,正如已经提到的,如果你真的关心它,你应该对它进行基准测试.Ruby的基准测试和配置文件工具肯定不是编程生态系统中最先进的,但他们完成了工作.

我的直觉是哈希会更快,因为(再次,我猜)case语句必须依次检查每个条件(找到项目O(n)而不是O(1)).但是,让我们检查一下!

完整的基准测试代码位于https://gist.github.com/25. 基本上,它生成一个文件,定义适当的case/hash然后使用它们.我继续将哈希查找放在方法调用中,这样开销就不会成为一个因素,但在现实生活中,没有理由将它放在方法中.

这就是我得到的.在每种情况下,我都在进行10,000次查找.时间是用户时间,以秒为单位

Case statement, 10 items  0.020000
Hash lookup, 10 items     0.010000

Case statement, 100 items  0.100000
Hash lookup, 100 items     0.010000

Case statement, 1000 items  0.990000
Hash lookup, 1000 items     0.010000
Run Code Online (Sandbox Code Playgroud)

因此,它看起来非常像case语句是O(n)(那里没有震撼).另请注意,即使在case语句中,10K查找仍然只有一秒,因此,除非您正在执行这些查找的度量标准,否则最好专注于其余代码.

  • 大小写顺序检查每个条件,可以使用调试器和单步执行来证明,加上大小写检查类型和相等,因为它是使用`===`实现的,所以我对你的结果并不感到惊讶.long` when`列表会减慢,所以值得尝试确定最常见的并将它们移到顶部,或者将测试分解为某种子组并使用嵌套的case语句. (2认同)

Mar*_*ner 7

由于这取决于许多因素(您想要转换多少个不同的ID,编译器如何智能地编译状态case when),我的建议是:测量它:

编写一个小的测试例程,然后将10.000.000 ids转换为字符串.在任一实现中执行此操作几次并比较结果.如果你没有显着差异,可以采取你喜欢的任何东西(我认为,哈希解决方案更优雅......)

  • 我建议使用Benchmark模块. (2认同)