O que é melhor em questão de Performance?

O que é melhor em questão de Performance? ( Uso de memoria/CPU )
Código A ou Código B?

[code]
/**
*

  • @author André Vinícius Lopes
    */
    public class deleteme {

    Object a;
    Object b;

    public void doSomething(Object c,Object d)
    {

     a = c;
     b = d;
     
     if(a.equals("aaa"))
     {
         
     }
     
     if(b.equals("bbb"))
     {
         
     }
     
     if(a == b)
     {
         
     }
     
     if (a.equals(b))
     {
         
     }
    

    }

    [/code]

[code] */
public class deleteme {

public void doSomething(Object c,Object d)
{
    
   Object a = c;
   Object b = d;
    
    if(a.equals("aaa"))
    {
        
    }
    
    if(b.equals("bbb"))
    {
        
    }
    
    if(a == b)
    {
        
    }
    
    if (a.equals(b))
    {
        
    }
    
    
}[/code]

Só uma coisa, no código que estou mexendo, nao posso usar o objeto C e D diretamente, eu tenho que, digamos, passar pra um novo objeto.È que no caso, o objeto c e D tem objetos que eu posso pegar por um index.

Classes sempre tem o nome começado com letra maiúscula.
Os dois códigos são iguais. Qual a dúvida?

[quote=drsmachado]Classes sempre tem o nome começado com letra maiúscula.
Os dois códigos são iguais. Qual a dúvida?[/quote]
Um usa variáveis de instância, e o outro variáveis locais.

Claro que ele poderia ter deixado a pergunta muito mais clara :slight_smile: Eu demorei pra achar a diferença.

Então, sinceramente, se não houverem problemas de concorrência, acho que você não vai sentir diferença nenhuma em performance e consumo de memória

Acredito que se puder ser as locais seria melhor, pois as globais(instência) ocupam espaço por todo o executar do projeto, só em casos de necessidade que devem ser utilizadas, se podem ser substituídas é a melhor coisa a se fazer, pois como deve saber, as variáveis locais, quando termina o comportamento morrem, sendo desalocadas da memória pelo gc quando ele passar.

Vlw.

[quote=diogogama]Acredito que se puder ser as locais seria melhor, pois as globais(instência) ocupam espaço por todo o executar do projeto, só em casos de necessidade que devem ser utilizadas, se podem ser substituídas é a melhor coisa a se fazer, pois como deve saber, as variáveis locais, quando termina o comportamento morrem, sendo desalocadas da memória pelo gc quando ele passar.

Vlw.[/quote]

Mas eu chamo esse método Muitas vezes durante o runtime…
E eu percebi pela análise de perfil do netbeans que a memoria usada vai aumentando… até 40mb±, ai o GC é chamado e volta pra 14, e depois se repete… estou achando que seja por causa disso.

O que acham?

Cara, 40 vezes não é igual estar instanciada o tempo todo… se chamar muitas vezes ele terá picos, pode ser por isso o seu problema, porém eu ainda acho que seja melhor dessa forma, visto que você está destruindo ela, pois e quando esse quadro mudar e você ficar com a aplicação ligada o tempo todo utilizando o método apenas uma vez? ou poucas vezes?

abraços.

[quote=diogogama]Cara, 40 vezes não é igual estar instanciada o tempo todo… se chamar muitas vezes ele terá picos, pode ser por isso o seu problema, porém eu ainda acho que seja melhor dessa forma, visto que você está destruindo ela, pois e quando esse quadro mudar e você ficar com a aplicação ligada o tempo todo utilizando o método apenas uma vez? ou poucas vezes?

abraços.[/quote]

Na verdade é um jogo que estou fazendo.
E esse método é chamado varias vezes, nao tem jeito de nao chamar.

Sim, mas não acho que deva passar para globais… eu pelo menos não gosto muito disso… deixar um variável instanciada por todo o tempo de uso da aplicação.

Mas a aplicação usa aquela variável o tempo todo…

Mas a aplicação usa aquela variável o tempo todo… [/quote]

Mas não é a variável que é coletada pelo GC, é o objeto referenciado por ela. Não adianta nada você ter uma variável global que muda de valor a toda hora. Pode acontecer de o GC não limpar o objeto justamente porque está sendo referenciado apenas por essa global, que terá o valor trocado na próxima chamada ao método.

Na java(jvm) pouca coisa faz diferença em questão de recursos. É assim porque existe o hotspot que está mexendo no seu código constantemente:

por exemplo:

[code]for(int i=0; i<1000; i++){

}

b+=a;
[/code]

Esse laço é removido do assembly pelo otimizador;

outro exemplo:

[code]for(int i=0; i<256; i++){

}
[/code]

se torna:

[code]for(int8 i=0; i<256; i++){//que é um byte

}
[/code]

Em suma alterações meramente sintáticas não fazem diferença para a máquina virtual.

n sei, mas usar a variavel como local e no final do metodo setar td como null n melhora n?
algo tipo assim:

public void doSomething(Object c,Object d)  
   {  
         
      Object a = c;  
      Object b = d;  
         
       if(a.equals("aaa"))  
       {  
             
       }  
         
       if(b.equals("bbb"))  
       {  
             
       }  
         
       if(a == b)  
       {  
             
       }  
         
       if (a.equals(b))  
       {  
             
       }  
         
         a=null;
         b=null;
   }  

eu n tenho certeza n, é meio q uma duvida pra mim tb, mas qdo vc seta todas as referencias de um objeto pra null entao fica mais facil pro GC coletar n é n? acho q pelo menos em teoria isso diminuiria o uso de memoria.

EDIT:
viajei, vc ta recebendo esses objetos como parametro, entao tem outras referencias a ele q provavelmente n devem ser setadas pra null, isso n vai funcionar

A melhor seria o código B, porém pode ficar melhor, de repente colocar os “else” no código se não existir a necessidade de verificação em todos os “if”. E o uso direto do objeto, de repente, não dá pra gente saber exatamente o que vc está querendo fazer.


	public void doSomething(Object a, Object b) {

		if (a.equals("aaa")) {

		} else if (b.equals("bbb")) {

		} else if (a == b) {

		} else if (a.equals(b)) {

		}
	}