我做了一个疯狂的猜测,将一个阵列溅到另一个阵列比将两个阵列加在一起要快,但在快速基准测试后我发现我错了.我假设解释器只是将splat转换为数组文字,并且不必+每次都调用它上面的方法.那么,为什么+比splat更快?
我使用了这个基准代码:
def test(trials = 1000)
head = [1,2,3]
tail = 100.times.to_a
t = Time.now.to_f
trials.times do |i|
a = [head, *tail]
end
puts "splat done in #{Time.now.to_f - t}"
t = Time.now.to_f
trials.times do |i|
a = head + tail
end
puts "+ done in #{Time.now.to_f - t}"
end
Run Code Online (Sandbox Code Playgroud)
我得到了这个结果:
2.2.5 :059 > test
splat done in 0.001013040542602539
+ done in 0.0009138584136962891
Run Code Online (Sandbox Code Playgroud)
增加试验:
2.2.5 :061 > test 1_000_000
splat done in 0.5123062133789062
+ done in 0.4400749206542969
Run Code Online (Sandbox Code Playgroud)
它非常接近,但一直稍微快一些.
为什么一个 stdlib 或核心功能比另一个慢?
因为它取决于提供给它的类型和/或数据。
Splat 并不总是与数组有关。它可以接受 anil并将其作为空数组处理——这里你已经有了一些条件行为,而数组的串联不是有条件的而是直接的。