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:

Migre o seu Domino do AIX/Windows para o Linux

Trabalhei com o IBM Domino em diversas plataformas (AIX/Windows/Linux/zLinux). Em todas o Domino tinham ótima performance e um uptime muito alto.

Mas quais seriam os motivos pra recomendar isso?

Vendo a apresentação “Notes Domino 2016 Roadmap.pptx”, a mesma apresentava como plataformas estratégicas para o Domino o Microsoft Windows Server e RedHat Enterprise Linux (RHEL).

Além dessa questão de estratégia, vejo outros motivos para migrar de AIX/Windows para Linux:

  • Ferramentas DevOps, como shell e puppet, padronizam o ambiente Domino, melhorando a performance, uptime e reduzindo o TCO.
  • SmartCloud usa esta plataforma.
  • Verse On-Premises para Linux, já está disponível para essa plataforma desde Janeiro/2017
  • Traveler na mesma plataforma
  • IBM mail support for Microsoft Outlook (IMSMO) na mesma plataforma
  • Flexibilidade entre a quantidade de Domino Partitions (DPAR) por VM, isto é, melhor uso de recursos ou maior isolamento. Uma DPAR é semelhante a uma instância Oracle,Melhorar o isolamento.

Apesar de atualmente não ser suportado, vejo como futuro o uso de containers Docker para execução do Domino ao invés de Virtual Machines (VM). Sobre Domino em Docker, sugiro dar uma olhada nessa apresentação feita  Matteo Bisi and Daniele Vistalii, e ver o artigo How to Run IBM Domino Server in Docker Container.

Leia também:

Como aumentar o número máximo de conexões simultâneas em Apache?

Fazer mais com menos é um desafio comum em TI e na vida real.

Mas como ouvi uma vez: “Tuning é configurar o ambiente para que ele suporte a quantidade de pessoas que ele aguenta, e não fazer o recurso abrir o bico”.

Como trabalho com Aplicações Web, já  vi na prática, em diversas situações, sobre o alto desempenho provido pelo servidor Apache 2.x.

Normalmente utilizo o IBM HTTP Server, que é a versão do Apache HTTP Server, suportado pelo laboratório da IBM. Sempre como front-end para servidores WebSphere Application Server (WAS).

Como estou estudando bastante esse assunto,  criei o artigo:

IHS: Otimizar o Apache Web Server para suportar mais conexões e clientes simultâneas

onde compartilho algumas configurações que permitem otimizar a capacidade de atendimento deste popular servidor http.

Aproveitem!!!

Leia também:

OpenMic: Overview of SAN Performance for ICS Solutions

O OpenMic é um webcast onde no final se abre para as perguntas.

No dia 24 de Abril, o assunto será a configuração do Storage Area Network (SAN) Performance para soluções de Colaboração.

Mais detalhes sobre o OpenMic, você pode encontrar na página do Suporte:

Título: Overview of SAN Performance

Data: 24 de Abril de 2013 – 12:00 às 13:00 Horário de Brasília.

URLhttp://www-01.ibm.com/support/docview.wss?uid=swg27038065

Custo: Gratuito

Web Conference URL:

Conference 9526-3802 -> https://apps.na.collabserv.com/meetings/join?id=9526-3802

 

Senha da conferência: 8985692

Telefones:

  • 55-11-3958-0769
  • 0800-8911977

Leia também: