以下两个更快的选项?
something {|i| i.foo }
something(&:foo)
我在某处将something(&:foo)
转换为something {|i| i.send(:foo) }
。这是真的吗?
如果这是真的,问题就变成了 - 哪个更快? i.foo
或i.send(:foo)
?
任何情况下,应该使用哪一个以获得更好的性能?
答案 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
这是萨瓦在答案中解释的不同结果。