require 'benchmark' letters = [*?A..?Z] str = 1_000_000.times.map { letters.sample }.join Benchmark.bm do |x| x.report("with_index") { str.each_char.with_index.sum{|c, i| c.ord + i + 1} } x.report("zip(1..)") { str.each_char.zip(1..).sum{|c, i| c.ord + i} } x.report("bytes.with_index") { str.each_byte.with_index.sum{|b, i| b + i + 1} } x.report("bytes.zip(1..)") { str.each_byte.zip(1..).sum{|b, i| b + i} } end __END__ user system total real with_index 0.188644 0.000984 0.189628 ( 0.189780) zip(1..) 0.479187 0.041009 0.520196 ( 0.520911) bytes.with_index 0.097072 0.012951 0.110023 ( 0.110138) bytes.zip(1..) 0.334842 0.009997 0.344839 ( 0.345032)