ruby性能 - 是&:比调用方法慢?

时间:2016-02-25 04:43:44

标签: ruby performance

以下两个更快的选项?

something {|i| i.foo }
something(&:foo)

我在某处将something(&:foo)转换为something {|i| i.send(:foo) }。这是真的吗?

如果这是真的,问题就变成了 - 哪个更快? i.fooi.send(:foo)

任何情况下,应该使用哪一个以获得更好的性能?

1 个答案:

答案 0 :(得分:1)

在ruby中,编写这样一个(微观)基准非常容易:

require 'benchmark/ips'

VALUES = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Benchmark.ips do |x|
  x.compare!

  x.report('symbol') do
    VALUES.each(&:odd?)
  end

  x.report('method') do
    VALUES.each do |value|
      value.odd?
    end
  end

  x.report('send') do
    VALUES.each do |value|
      value.send(:odd?)
    end
  end
end

(最新版本为https://github.com/pascalbetz/benchmarks/blob/master/symbol_vs_proc.rb

Ruby 1.9.3
symbol:  1349424.7 i/s
method:  1049894.7 i/s - 1.29x slower
send:   929240.4 i/s - 1.45x slower


Ruby 2.2.2
symbol:  1358391.5 i/s
method:  1146686.4 i/s - 1.18x slower
send:   820392.7 i/s - 1.66x slower


JRuby 9.0.5.0
symbol:  2959040.8 i/s
method:  2016911.1 i/s - 1.47x slower
send:  1305816.9 i/s - 2.27x slower

这是萨瓦在答案中解释的不同结果。