Descubra como funciona autoboxing e cuidados com performance que você deve ter
The Java Specialists' Newsletter [Issue 090] - Autoboxing Yourself in JDK 1.5 2004-06-22
Em meu último curso de Java em Pretoria ( África do Sul ), demonstrei aos alunos como funcionava o recurso de autoboxing. Nossos testes mostraram que autoboxing pode ser ineficiente. Por mais legal que o recurso seja, ele é também especialmente perigoso. Estudantes de Java podem usar autoboxing por engano, afetando a performance de forma negativa.
Contudo, antes que eu me aprofunde no assunto, eu gostaria de lhes mostrar um pouco sobre o novo loopfor.
Por volta de dois anos e meio atrás, reclamei amargamente da síntaxe do Iterator. Eu sentia que usando um loop for ou while juntamente com conversões de tipo tendia a tornar o código-fonte feio. A nova forma de utilização do for no JDK 1.5 finalmente confirma a minha reclamação. Eis como você pode usá-lo em seu código:
01 import java.util.*; |
Podemos combinar autoboxing com Generics. Autoboxing é o processo de converter tipos primitivos para objetos e vice-versa, automaticamente. Meu código de exemplo na newsletter 40 poderia ser escrito mais elegantemente como:
1 public void showAging(Collection |
Descobri por acidente que é possível também usar o novo loop for com arrays:
1 public class NewForArrays { |
Não é maravilhoso? Após muito tempo, uma forma consistente de iterar por coleções e arrays. Isso funciona mesmo para arrays de tipos primitivos:
01 public class NewForPrimitiveArrays { |
Quando descompilamos a classe, vemos o seguinte ( não tão mal ):
01 public class NewForPrimitiveArrays { |
Um grande medo dos programadores é que você pode usar algumas formas de construção que por sua vez tornam o código inaceitavelmente lento. Eis aqui um código que compara a performance entre a forma "antiga" e a "nova":
01 import java.util.*; |
Quando rodo este programa, tenho a seguinte saída:
oldFor: 3532 in 2003ms newFor: 3561 in 2003ms |
Ambos métodos são similares o suficiente que podemos declarar que não existe diferença entre eles. Então, você deixaria de usar o novo loop for para ficar lutando com Iterators?
Perigo espreitando logo abaixo
Vamos assumir que exércitos de programadores Java irão passar a usar Generics e o novo for. Isso irá toranr arrays redundantes, uma vez que autoboxing nos permite usar ints com Collections ( repare que estamos adicionando e pegando valures da Collection como um tipo de dado primitivo int, mas o tipo de objeto na collection é um Integer ):
01 import java.util.*; |
Vamos ver o que acontece quando temos uma collection de números, e desejamos incrementar todos os valores:
01 import java.util.*; |
Quando rodo este programe em meu notebook, vejo uma enorme diferença de performance. O acesso direto ao array de ints é por volta de 20 vezes mais rápida.
autoboxing com Generics levou 9954ms Usando um array normal levou 551ms |
Generics são extremamente fáceis de aprender, e após usando-os por algumas horas, eu não quero voltar para Collections sem tipagem. Contudo, temos que estar conscientes quando fazemos algumas coisas estúpdas que podem impactar na performance, como usar autoboxing quando não devemos.
Este artigo é fruto de uma parceria entre o GUJ e o autor da The Java Specialists Newsletter, Dr. Heinz M. Kabutz. Originalmente publicadas em inglês e enviadas para milhares de leitores ao redor do planeta, o GUJ propô-se a realizar a tradução para o Português do conteúdo, disponibilizando assim um ótimo material para um número ainda maior de leitores.
Você encontra o documento original, assim como newsletters anteriores, no site oficial, emhttp://www.javaspecialists.co.za.
Por Rafael Steil
Nenhum comentário:
Postar um comentário
Comentários sobre assuntos não relacionados ao objetivo deste blog serão removidos.