Inteiro de auto-unboxing e auto-boxing dá problemas de desempenho?
Pergunta
Atualmente, estamos fazendo algumas iterações e outras operações com x++;
onde x
é um Integer
e não um int
.
As operações podem ser repetidas ao longo de algumas operações do usuário em nosso sistema, mas nada muito complexo ou numerosos como um Matemático aplicação, até o máximo de 10000 vezes por transação do usuário..
Será que este unboxing e, mais tarde, boxe afetar o nosso desempenho por alguns perceptível milissegundos?
Solução
http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html
"O desempenho da lista resultante é susceptível de ser pobres, como caixas ou unboxes em todos os obter ou definir a operação.É muito rápido o suficiente para uso ocasional, mas seria loucura para usá-lo em uma crítica do desempenho loop interno.
Então, quando você deve usar autoboxing e unboxing?Use-os apenas quando há uma "impedância" incompatibilidade entre tipos de referência e primitivas, por exemplo, quando você tem que colocar os valores numéricos em uma coleção.Não é apropriado para uso autoboxing e unboxing para a computação científica, ou outros de desempenho sensíveis código numérico.Um Inteiro não é um substituto para um int;autoboxing e unboxing borrar a distinção entre tipos primitivos e tipos de referência, mas não eliminá-lo."
Outras dicas
Sim, há um impacto de desempenho.O código equivalente produzido para ++x
envolve a criação de um novo número Inteiro objeto de cada vez. x++
além disso, cria uma variável temporária para armazenar o número inteiro anterior de referência, e alguns de manipulação.Você pode verificar isso por desmontar o arquivo de classe.
A velocidade de auto-boxing depende da JVM versão que você está usando, o intervalo de números reais que você está trabalhando, e seu GC configurações.Ver este realmente interessante artigo de fundo sobre (onu)desempenho de boxe.
Basicamente, a JVM caches de um número Inteiro de objetos para que ele não precise criar os "comuns", aqueles a cada vez.Você pode configurar esse tamanho de cache.
Como para a questão específica:Será que a sua operação seja milissegundos mais lento se você usar primitivos versus autoboxing?Isso depende inteiramente do tamanho da lista e como muitas vezes ele é chamado.Deve ser fácil (eu acho!) para testar o primitivo alternativa ao desempenho.