我们在时间紧迫的脚本中有几个地方将旧的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基本上,它生成一个文件来定义适当的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
所以,它看起来很像case语句是O(n)(没有令人震惊的那里).还要注意,即使在case语句中,10K查找仍然只有一秒钟,因此除非您正在执行这些查找的指标,否则您最好关注其余的代码.