Problema:
Ontem eu tive que acrescentar cerca de ~ 100-200K pequenas strings (comprimento médio 7) para formar uma única string grande. Eu tinha usado + operador e era muito lento. Para encontrar uma alternativa mais rápida, fiz o seguinte experimento de benchmarking:
Solução:
TL; DR: use em .concat
vez de+
def bm_concat limit
str = ""
limit.times do
str.concat("abcdefg")
end
end
def bm_plus limit
str = ""
limit.times do
str += "abcdefg"
end
end
def diff t1, t2
puts (t2-t1)
end
limit = ARGV[0]
which = ARGV[1]
puts "LIMIT: #{limit} , WHICH: #{which}"
if which == "plus"
t = Time.now
bm_plus limit.to_i
t2 = Time.now
else
t = Time.now
bm_concat limit.to_i
t2 = Time.now
end
diff(t,t2)
Ao substituir +
por .concat
no meu código original, foi 4x mais rápido!
Os resultados do código acima para vários parâmetros são: