Performance com Strings e StringBuilder em Java

Semana passada, estava trabalhando em uma ferramenta em java, que coletava algumas informações e gerava uma saída para um arquivo txt.

Ao testar a ferramenta com um grande volume de dados, me surpreendi que ela gastava mais tempo de execução na concatenação de String do que na escrita do arquivo.

Não podia deixar a ferramenta assim e como um bom programador resolvi melhorar o meu código. E olha como ficou o resultado.

Na primeira versão concatenava usando apenas Uma String (output), código abaixo:

long prev_time = System.currentTimeMillis();
long time;
String output = "";

for (Device device : this.devices) {
 output += "\"deviceid\": \"" + device.deviceid + "\", ";
....
}
time = System.currentTimeMillis() - prev_time;
System.out.println("Time after for loop " + time);

O resultado foi “Time after for loop 233117 ms“, a ferramenta gastava aproximadamente 4 minutos para executar.

Na segunda versão, usei Duas Strings (output e output2) para fazer a concatenação, código abaixo:

long prev_time = System.currentTimeMillis();
long time;
String output = "";

for (Device device : this.devices) {
 String output2 = "";
 output2 += "\"deviceid\": \"" + device.deviceid + "\", ";
....
 output += output2;
}
time = System.currentTimeMillis() - prev_time;
System.out.println("Time after for loop " + time);

O resultado foi “Time after for loop 22929 ms“, a ferramenta agora gastava apenas 22 segundos para processar. Muito bom!!!

Achei que não deveria parar nesse valor e procurei qual outro tipo de classe Java, que poderia utilizar, e num pesquisa rápida encontrei o StringBuilder.

Na terceira versão usei o StringBuilder, veja código abaixo:

long prev_time = System.currentTimeMillis();
long time;
StringBuilder sb = new StringBuilder();

for (Device device : this.devices) {
 String output2 = "";
 output2 += "\"deviceid\": \"" + device.deviceid + "\", ";
....
 sb.append(output2);
}
time = System.currentTimeMillis() - prev_time;
System.out.println("Time after for loop " + time);
String output3 = sb.toString();

O resultado foi  “Time after for loop 137 ms“, impressionantes 137 milissegundos.

Performance é sempre um desafio, mas melhor ainda é compartilhar. #FicaADica

Leia também:

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.