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

标签 ruby performance

在时间紧迫的脚本中,我们有几个地方可以将旧 ID 转换为字符串。目前,我们在函数内部使用 case 语句,如下所示:

def get_name id
  case id
    when 1
      "one thing"
    when 3
      "other thing"
    else
      "default thing"
  end
end

我正在考虑将其替换为哈希查找,如下所示:

NAMES = {
  1 => "one thing",
  3 => "other thing",
}
NAMES.default = "default thing"

感觉使用 NAMES[id] 应该比使用 get_name(id) 更快 - 但真的是这样吗?

最佳答案

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

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

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

这是我得到的。在每种情况下,我都会进行 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

因此,case 语句看起来非常像 O(n)(这并不令人震惊)。另请注意,即使在 case 语句中,10K 次查找仍然只有一秒钟,因此除非您对这些查找进行度量但加载,否则最好将注意力集中在其余代码上。

关于ruby - 在 ruby​​ 中哪个更快 - 散列查找或带有 case 语句的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4178240/

相关文章:

ruby - 如何将过程存储到变量(稍后调用)

c# - Azure 云服务的 for 循环在生产环境中比在本地主机上慢得多

ruby - 如何在Ruby中以流形式播放音频

html - rails/哈姆 : adding a parentclass every n iteration

ruby - 是否可以使用 Ruby LDAP 更改 AD 用户帐户?

vb.net - .NET 中的 IsNumeric() 占用了这么长时间的原因是什么?

performance - 将参数传递给 cellfun matlab

c# - 在 if block 内部返回或编写 if/else block 之间是否存在性能差异?

performance - 如何调出内存异常 Spark

ruby - 在 Jekyll 页面中使用 Liquid 标签不起作用