我们在时间关键的脚本中有几个地方将旧 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]
than get_name(id)
- 但真的是这样吗?
首先,有几点。一是像这样的低级语言结构或多或少做同样的事情几乎从来都不是任何现实应用程序的瓶颈,所以关注它们(通常)是愚蠢的。其次,正如已经提到的,如果你真的关心它,你应该对其进行基准测试。 Ruby 的基准测试和分析工具当然不是编程生态系统中最先进的,但它们可以完成工作。
我的直觉是散列会更快,因为(我再次猜测)case 语句必须依次检查每个条件(使得查找项目的时间复杂度为 O(n) 而不是 O(1))。但让我们检查一下!
完整的基准测试代码位于https://gist.github.com/25 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 次查找仍然只需要一秒钟,因此除非您正在对这些查找进行度量但加载,否则最好将重点放在代码的其余部分上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)