From: Colin Bartlett Date: 2011-01-25T06:43:41+09:00 Subject: Re: Enumerable.inject_with_index? I'm curious as to when and why people use each_with_index and/or inject, etc, instead of a somewhat less elegant, and admittedly possibly less flexible, more direct approach. (Which usually(?) takes about the same number of characters for the code.) ary = [3, 4, 5] rrr = ary.each_with_index.inject(0) { |sum, (v, index)| sum + v * index } p rrr #=> 14 index = -1; rrr = ary.inject(0) { |sum, v| index += 1; sum + v * index } p rrr #=> 14 rrr = 0; ary.each_with_index { |v, index| rrr += v * index }; rrr p rrr #=> 14 index = -1; rrr = 0; ary.each { |v| index += 1; rrr += v * index }; rrr p rrr #=> 14 require "benchmark" kt = 500_000 Benchmark.bmbm() do |bm| bm.report( "each_with_index.inject(0)" ) { kt.times { rrr = ary.each_with_index.inject(0) { |sum, (v, index)| sum + v * index } } } bm.report( "inject(0)" ) { kt.times { index = -1; rrr = ary.inject(0) { |sum, v| index += 1; sum + v * index } } } bm.report( "each_with_index" ) { kt.times { rrr = 0; ary.each_with_index { |v, index| rrr += v * index } } } bm.report( "each" ) { kt.times { index = -1; rrr = 0; ary.each { |v| index += 1; rrr += v * index } } } end #=> Rehearsal ------------------------------------------------------------- each_with_index.inject(0) 2.410000 0.000000 2.410000 ( 2.404242) inject(0) 1.000000 0.000000 1.000000 ( 1.000677) each_with_index 0.840000 0.010000 0.850000 ( 0.846287) each 0.640000 0.000000 0.640000 ( 0.640142) ---------------------------------------------------- total: 4.900000sec user system total real each_with_index.inject(0) 2.380000 0.020000 2.400000 ( 2.392590) inject(0) 1.000000 0.000000 1.000000 ( 0.999785) each_with_index 0.850000 0.000000 0.850000 ( 0.846178) each 0.640000 0.000000 0.640000 ( 0.639366) (My apologies if the benchmarks are ragged and unaligned.)