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