La regola d'oro dell'ottimizzazione: misura, non indovinare. Ruby ha il modulo Benchmark integrato per confrontare approcci diversi con dati reali.

require "benchmark"

array = (1..100_000).to_a

Benchmark.bm(10) do |x|
  x.report("each+push") do
    r = []
    array.each { |n| r << n * 2 }
  end
  x.report("map") do
    array.map { |n| n * 2 }
  end
end

Benchmark.bm esegue ogni blocco e stampa il tempo impiegato, così vedi nero su bianco quale strada è più veloce. Per confronti più rigorosi (con riscaldamento e statistica) c'è la gem benchmark-ips, che misura le iterazioni al secondo.

Perché conta: le intuizioni sulle performance sbagliano di continuo. Quella che "sembra" più veloce spesso non lo è, e l'ottimizzazione prematura complica il codice senza guadagni. Prima misuri, poi ottimizzi solo ciò che i numeri indicano come lento davvero. Il resto lascialo leggibile.