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

时间:2016-06-17 18:29:40

标签: 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

我得到了这个结果:

2.2.5 :059 > test
splat done in 0.001013040542602539
+ done in 0.0009138584136962891

增加试验:

2.2.5 :061 > test 1_000_000
splat done in 0.5123062133789062
+ done in 0.4400749206542969

它非常接近,但一直稍快。

1 个答案:

答案 0 :(得分:0)

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

Splat并不总是关于数组。它可以采用nil并将它作为一个空数组处理 - 这里你已经有了一些条件行为,而数组'连接不是有条件的,而是直接的。