Neste artigo, gostaria de considerar, analisar, contar e mostrar qual é a diferença entre o método append da classe
Sim, uma pessoa que sem dúvida não se aprofundou nesta questão dirá: "Por que devo substituir o operador += criando um novo objeto de uma classe completamente diferente e depois chamar o método também
StringBuilder
e o operador +=
for String
. Aqui a questão não será tanto nas áreas de aplicação, mas na otimização do código.
toString()
? Que tipo de otimização estamos falando? A escolha é óbvia, do que você está falando? e ele estaria completamente errado. Um dos problemas é que String
não é primitivo. String
- um objeto como qualquer outro class
em Java, e como você sabe, em Java não existe sobrecarga de operador (como em C++, por exemplo), os operadores são definidos apenas para primitivos, e para qualquer classe não podemos substituir nenhum operador. É por isso que os operadores " +
" e " +
= " são uma espécie de "muleta" da biblioteca Java, e uma muleta sempre incorre em perdas. Na verdade, vamos parar de puxar o rabo do gato e passar às medidas. Aqui está um programa simples que mede o tempo que leva para “colar” uma linha com uma variável de loop 100.000 vezes.
public class MainClass
{
private static long time;
public static void main(String[] args)
{
saveTime();
String s = "Hello";
for(int i = 0; i < 100000; ++i)
{
s+=i;
}
printDiff();
}
private static void saveTime()
{
time = System.currentTimeMillis();
}
private static void printDiff()
{
System.out.println((System.currentTimeMillis() - time) + "ms");
}
}
No meu computador, 6815ms foram exibidos no console. Ou seja, meu computador levou quase 7 segundos para costurar essa linha. Agora vamos substituí-lo pelo StringBuilder e ainda incluir o método toString()
nas medidas.
public class MainClass
{
private static long time;
public static void main(String[] args)
{
saveTime();
StringBuilder sb = new StringBuilder("Hello");
for(int i = 0; i < 100000; ++i)
{
sb.append(i);
}
String s = sb.toString();
printDiff();
}
private static void saveTime()
{
time = System.currentTimeMillis();
}
private static void printDiff()
{
System.out.println((System.currentTimeMillis() - time) + "ms");
}
}
Meu PC me disse 10ms. Ou seja, 0,01 segundos. Acho que a diferença na prática é bastante óbvia: grosso modo, funcionou 700 vezes append
mais rápido. Isso se deve ao fato de que muito provavelmente " +
" e " +=
" podem eles próprios chamar o mesmo apêndice, mas ao mesmo tempo tendo percorrido um longo caminho através das muletas da linguagem para entender que tal operador existe e o que ele deveria fazer (o último parágrafo nada mais é do que um palpite, não sou um desenvolvedor JVM e não sei o que existe e como). Este é um exemplo claro de que um objeto extra nem sempre é caro. Sim, o código terá algumas linhas a mais, mas a economia de tempo em grandes projetos pode ser colossal. Observe que as medições não foram feitas em um PC de escritório com processador pré-histórico, mas agora imagine a diferença que isso fará neste mesmo computador de escritório, que dificilmente consegue puxar o lenço.
GO TO FULL VERSION