为什么组合数组时Ruby的splat比使用+组合数组要慢?

Die*_*zar 6 ruby performance

我做了一个疯狂的猜测,将一个阵列溅到另一个阵列比将两个阵列加在一起要快,但在快速基准测试后我发现我错了.我假设解释器只是将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)

它非常接近,但一直稍微快一些.

Nak*_*lon 0

为什么一个 stdlib 或核心功能比另一个慢?
因为它取决于提供给它的类型和/或数据。

Splat 并不总是与数组有关。它可以接受 anil并将其作为空数组处理——这里你已经有了一些条件行为,而数组的串联不是有条件的而是直接的。