Deixe-me mostrar a você toda a minha experiência com isso.
Eu tive uma consulta que retornou 32k de registros, para cada registro eu chamei um método para formatar esse registro de banco de dados em uma string formatada e concatená-la em uma String que ao final de todo esse processo se transformará em um arquivo em disco.
Meu problema era que, segundo os registros, em torno de 24k, o processo de concatenação da String causava dor.
Eu estava fazendo isso usando o operador '+' regular.
Quando mudei para o '<<' era como mágica. Foi muito rápido.
Então, lembrei-me dos meus velhos tempos - tipo 1998 - quando eu estava usando Java e concatenando String usando '+' e mudei de String para StringBuffer (e agora nós, desenvolvedor Java, temos o StringBuilder).
Eu acredito que o processo de + / << no mundo Ruby é o mesmo que + / StringBuilder.append no mundo Java.
O primeiro realoca o objeto inteiro na memória e o outro apenas aponta para um novo endereço.