require 'benchmark/ips'
Benchmark.ips do |x|
h = {a: 1, b: 2}.freeze
# Warning: these operations don't all have the same effect due to different ordering
x.report("splat at start") { {**h, c: 3, d: 4} }
x.report("splat at end") { {c: 3, d: 4, **h} }
x.report("splat at middle") { {c: 3, **h, d: 4} }
x.report("merge literal into named") { h.merge(c: 3, d: 4) }
x.report("merge named into literal") { {c: 3, d: 4}.merge(h) }
x.compare!
end
puts RUBY_DESCRIPTION
注意:在ruby 3上,你需要安装benchmark-ips gem。
Warming up --------------------------------------
splat at start 527.143k i/100ms
splat at end 578.550k i/100ms
splat at middle 512.272k i/100ms
merge literal into named
415.284k i/100ms
merge named into literal
546.939k i/100ms
Calculating -------------------------------------
splat at start 5.087M (± 3.9%) i/s - 25.830M in 5.085388s
splat at end 5.794M (± 2.4%) i/s - 29.506M in 5.095522s
splat at middle 5.062M (± 3.1%) i/s - 25.614M in 5.064780s
merge literal into named
4.139M (± 2.3%) i/s - 20.764M in 5.019108s
merge named into literal
5.324M (± 3.4%) i/s - 26.800M in 5.039716s
Comparison:
splat at end: 5794056.5 i/s
merge named into literal: 5324076.5 i/s - 1.09x slower
splat at start: 5087349.1 i/s - 1.14x slower
splat at middle: 5062140.5 i/s - 1.14x slower
merge literal into named: 4139241.2 i/s - 1.40x slower
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin19]
因此,似乎splats,其中splat的散列位于最后位置,是最快的。 有趣的是,“merge literal into named”是最慢的。 注意:如果你的键被覆盖,你不能总是定位哈希以获得最佳性能,因为你会得到不同的结果。
2条答案
按热度按时间qmelpv7a1#
基本基准
表明合并更快,例如
jq6vz3qz2#
差别很小,除非你在一个紧密的循环中执行数百万个这样的操作。
哪一个更快取决于哈希的“位置”。观察:
注意:在ruby 3上,你需要安装benchmark-ips gem。
因此,似乎splats,其中splat的散列位于最后位置,是最快的。
有趣的是,“merge literal into named”是最慢的。
注意:如果你的键被覆盖,你不能总是定位哈希以获得最佳性能,因为你会得到不同的结果。