在时间紧迫的脚本中,我们有几个地方可以将旧 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/