Да, читаемость кода важнее микрооптимизаций. Разница едва заметна, даже если взять сумму миллионов элементов. Кроме того, оба метода O(n)
, поэтому ни один из них не будет значительно превосходить другой по мере увеличения количества элементов.
Как уже отмечали другие, inject(:+)
еще немного быстрее. Даже если это не так, выберите тот, который проще для глаз, и не беспокойтесь о крошечных различиях в производительности. Вероятно, это не будет узким местом в вашем приложении.
require "benchmark"
N = 5_000_000
Benchmark.bmbm do |bm|
bm.report "inject 1" do
(1..N).inject(0) { |x, y| x + y }
end
bm.report "inject 2" do
(1..N).inject(:+)
end
bm.report "each" do
sum = 0
(1..N).each do |value|
sum += value
end
end
end
Результаты:
user system total real
inject 1 0.610000 0.000000 0.610000 ( 0.613080)
inject 2 0.370000 0.000000 0.370000 ( 0.370892)
each 0.570000 0.000000 0.570000 ( 0.568266)