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:
Etcetc=null;for(inty=0; y < etc.length; y++) {etc=newEtc();etc.save();
}
Caso 2:
for(inty=0; y < etc.length; y++) {Etcetc=newEtc();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 ?
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:
Etcetc=null;for(inty=0; y < etc.length; y++) {etc=newEtc();etc.save();
}
Caso 2:
for(inty=0; y < etc.length; y++) {Etcetc=newEtc();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
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
GilsonNunes
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(inty=0; y < etc.length; y++) { Etcetc=newEtc(); etc.save();
}