我发现当我新建一个Hash时,它有七个对象比六个长度哈希慢得多。我知道哈希的长度会影响性能。但我不知道为什么七是一个特殊的。
以下是基准(Ruby 2.2.3
)的代码:
require 'benchmark/ips'
Benchmark.ips do |x|
x.report(5) { { a: 0, b: 1, c: 2, d: 3, e: 4 } }
x.report(6) { { a: 0, b: 1, c: 2, d: 3, e: 4, f: 5 } }
x.report(7) { { a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6 } }
x.report(8) { { a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7 } }
x.report(9) { { a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8 } }
x.compare!
end
结果就是打击:
Calculating -------------------------------------
5 65.986k i/100ms
6 63.966k i/100ms
7 30.713k i/100ms
8 28.991k i/100ms
9 27.115k i/100ms
-------------------------------------------------
5 1.243M (± 4.3%) i/s - 6.203M
6 1.202M (± 5.3%) i/s - 6.013M
7 373.366k (±13.7%) i/s - 1.843M
8 351.945k (± 8.8%) i/s - 1.768M
9 331.398k (± 8.2%) i/s - 1.654M
Comparison:
5: 1243005.5 i/s
6: 1202032.4 i/s - 1.03x slower
7: 373366.5 i/s - 3.33x slower
8: 351945.1 i/s - 3.53x slower
9: 331398.3 i/s - 3.75x slower
答案 0 :(得分:5)
来自Hash lookup in Ruby, why is it so fast?:
Ruby动态管理bin的大小。它从11开始,只要其中一个分区有5个或更多元素,就会增加bin大小,并将所有哈希元素重新分配到新的相应bin。
在某些时候,当Ruby调整bin池的大小时,你会花费指数增加的时间惩罚,但是如果你考虑它,它值得花时间,因为这将使查询时间和内存使用尽可能低。
这意味着箱子越多,在箱子中寻找特定钥匙的时间就越少。
希望有助于理解这种行为。