[RESOLVIDO] new dentro do loop

5 respostas
hitcurst

Olá,

Estava desenvolvendo agora, e me deparei em uma situação
onde já fui muito questionado, e onde eu também já muito questionei
outros colegas de trabalho desenvolvedores.

Existe diferença neste trecho de código em termos
de memória e performance? Ou o Java otimiza isso no bytecode ?

Caso 1:

Etc etc = null;
for (int y = 0; y < etc.length; y++) {
    etc = new Etc();
    etc.save();
}

Caso 2:

for (int y = 0; y < etc.length; y++) {
    Etc etc = new Etc();
    etc.save();
}

No primeiro caso ele estaria alocando 1 local em memória
e reutilizando ele para todos os objetos… e no segundo ele estaria
alocando N locais diferentes para cada objeto ?

Foi uma dúvida que surgiu :wink:
Valeu!

5 Respostas

D

hitcurst:
Olá,

Estava desenvolvendo agora, e me deparei em uma situação
onde já fui muito questionado, e onde eu também já muito questionei
outros colegas de trabalho desenvolvedores.

Existe diferença neste trecho de código em termos
de memória e performance? Ou o Java otimiza isso no bytecode ?

Caso 1:

Etc etc = null;
for (int y = 0; y < etc.length; y++) {
    etc = new Etc();
    etc.save();
}

Caso 2:

for (int y = 0; y < etc.length; y++) {
    Etc etc = new Etc();
    etc.save();
}

No primeiro caso ele estaria alocando 1 local em memória
e reutilizando ele para todos os objetos… e no segundo ele estaria
alocando N locais diferentes para cada objeto ?

Foi uma dúvida que surgiu :wink:
Valeu!

no primeiro caso ele só define ‘etc’ do tipo ‘Etc’ e nada mais,
no loop faz as instanciacoes e chama o metodo

no segundo caso ele ja define o tipo de etc e o instancia

ambos usará a mesma memoria, pois só ocupa memoria quando instancia o objeto,

quanto a performance pode ser um pouco melhor a primeira opcao, pois ja será instanciado o objeto com o tipo definido previamente,
mas nada de mais, dependendo da aplicação será um desempenho insignificante a mais

adriano_si

A diferença é onde cada componente reside.

Lembre que as variáveis de instância residem na pilha e também ocupam lugar na memória que desalocado no momento em que o método sai da pilha, levando em consideração que essa variável estará dentro de um escopo de método.

Já os objetos residem no Heap e esse só é desalocado quando o Garbage Collector executa e você não tem controle sobre isso…

O que eu não lembro agora é se a pilha é montada também para o Loop, mas eu tenho quase que certeza (99%) que não… a pilha é só para métodos, então sim, levando isso em consideração o método 1 tem mais probabilidade de ser o mais performático.

Afinal você não ocupará Ns espaços na pilha e elegerá o seu Objeto criado para o coletor, assim que o Loop for para a próxima iteração.

Abs []

G

no quisito performance, não muda nada!
muda somente o escopo da variavel local.

a questão pilha x heap, ambos vão ter uma referencia na pilha e pra cada interação vai ser alocado no reap um Etc q logo apos o .save é colocada à disposição do GC.

caio.ribeiro.pereira

Em performance não muda nada, só muda o escopo de onde é instanciado o objeto.

Porém por questões de legibilidade de código a segunda versão é melhor pq é uma linha a menos para definir, sem contar que é uma boa prática na maioria dos casos

for (int y = 0; y < etc.length; y++) {  
    Etc etc = new Etc();  
    etc.save();  
}
hitcurst

Entendi!
Valeu pelas resposta pessoal!

Criado 6 de março de 2012
Ultima resposta 7 de mar. de 2012
Respostas 5
Participantes 5