Qual dos dois códigos é mais eficiente?

8 respostas
Andre_Brito

Bom… preciso verificar um valor booleano. Caso ele seja verdade, ele executa uma parte do código que gera um i e outro j, mas se ele for false, ele vai gerar um i e outro j, só que algumas operações dentro desse bloco são diferentes.

Queria saber o que é melhor: fazer as verificações antes e gerar em cada bloco ou gerar os valores antes e dentro destes fazer a verificação?

Qual dos dois código é mais eficiente?

if (aleatorio)
         {
             do {      /* Procura até encontrar 2 individuos que possuam a taxa de cruzamento iguais. */
                do {
                    i = geradorAleatorio.nextInt(numeroIndividuos);
                    j = geradorAleatorio.nextInt(numeroIndividuos);
                } while ((populacao[j].getTaxaCruzamento() <= taxaCruza) && (populacao[j].getTaxaCruzamento() <= taxaCruza));
                
                posicao = returnPosicao();
                
                System.out.println("Cruzando individuos " + (i+1) + " e " + (j+1) + " na posicao " + posicao + ".");
                swap(posicao, i, j);
                
                populacao[i].calculaFitness();
                populacao[j].calculaFitness();
                        
                contador++;
            } while (contador < quantidadeCruzamentos);
        }
        /* Se os campos nao forem aleatorios, sera sempre cruzado o campo da quantidade 2. */
        else
        {
            do {      /* Procura até encontrar 2 individuos que possuam a taxa de cruzamento iguais. */
                do {
                    i = geradorAleatorio.nextInt(numeroIndividuos);
                    j = geradorAleatorio.nextInt(numeroIndividuos);
                } while ((populacao[j].getTaxaCruzamento() <= taxaCruza) && (populacao[j].getTaxaCruzamento() <= taxaCruza));
                                
                System.out.println("Cruzando individuos " + (i+1) + " e " + (j+1) + " na posicao " + posicao + ".");
                swap(posicao, i, j);
                
                populacao[i].calculaFitness();
                populacao[j].calculaFitness();
                        
                contador++;
            } while (contador < quantidadeCruzamentos);
        }

Ou esse:

do {      /* Procura até encontrar 2 individuos que possuam a taxa de cruzamento iguais. */
            do {
                i = geradorAleatorio.nextInt(numeroIndividuos);
                j = geradorAleatorio.nextInt(numeroIndividuos);
            } while ((populacao[j].getTaxaCruzamento() <= taxaCruza) && (populacao[j].getTaxaCruzamento() <= taxaCruza));
            
            if (aleatorio)
            {
                posicao = returnPosicao();
               
                System.out.println("Cruzando individuos " + (i+1) + " e " + (j+1) + " na posicao " + posicao + ".");
                swap(posicao, i, j);
                
                populacao[i].calculaFitness();
                populacao[j].calculaFitness();
            }
            else
            {
                System.out.println("Cruzando individuos " + (i+1) + " e " + (j+1) + " na posicao " + posicao + ".");
                swap(posicao, i, j);
                
                populacao[i].calculaFitness();
                populacao[j].calculaFitness();
            }
            contador++;
                
         } while (contador < quantidadeCruzamentos);

8 Respostas

T

Meça o tempo que ambos os códigos levam.
Como você está aprendendo estatística, faça uma análise estatística - porque a cada medição esses tempos vão variar.
Uma coisa que aprendi é que muitas vezes só de ver um código você não consegue saber de antemão se vai ser mais rápido ou não, a menos que ele tenha erros de desempenho gritantes.

Marky.Vasconcelos

Um modo de medir o tempo de execução pode ser através do System.getTimeInMillis()

Algo assim

long inicio = System.getTimeInMillis();//O momento inicial

//Só pra passar o tempo
List<Integer> list = new ArrayList<Integer>();
for(int i = 0;i< 100;i++){
list.add(i);
list.contains(i);
}//Fim da espera

long final = System.getTimeInMillis(); //Momento quando quero para de medir o tempo
System.out.println((final - inicio) / 1000);// o /1000 é para mostrar em Segundos já que o getTimeInMillis pega os mili-segundos
Andre_Brito

Hummm… ok : ) valeu!

A

Provavelmente não deve ter muita diferença em tempo de execução entre eles, ou esse vai depender dos sub-métodos que utilizam. Baseio nisso pelo fato que superficialmente a complexidade de ambos é O( n² ).

K

Creio que você pode fazer esta medição dos milisegundos, porém utilizando n iterações do método, para verificar a diferença em um processamento em massa.

Marky.Vasconcelos

Mas eu acho que se isso não está te trazendo a erros visiveis de performance, não é necessário tanta otimização.

sergiotaborda

Depende do que vc chama eficiencia. Para mim , é mais importante entender o codigo do quanto ele demora.
Logo, para mim, a segunda é melhor.

Mas a segunda não seria o mesmo que :

do {      /* Procura até encontrar 2 individuos que possuam a taxa de cruzamento iguais. */
            do {
                i = geradorAleatorio.nextInt(numeroIndividuos);
                j = geradorAleatorio.nextInt(numeroIndividuos);
            } while ((populacao[j].getTaxaCruzamento() <= taxaCruza) && (populacao[j].getTaxaCruzamento() <= taxaCruza));
            
            if (aleatorio) {
                posicao = returnPosicao();
             }
            System.out.println("Cruzando individuos " + (i+1) + " e " + (j+1) + " na posicao " + posicao + ".");
            swap(posicao, i, j);
                
            populacao[i].calculaFitness();
            populacao[j].calculaFitness();
            

            contador++;
                
         } while (contador < quantidadeCruzamentos);

não ?

Andre_Brito

Pois é… eu também acredito que se o programa está funcionando e não está usando “gambiarras” ele está perfeito… só iria mudar se a performance dele fosse gritante, como disse o thingol. E eu concordo com o que o sergiotaborba falou também.

Criado 30 de outubro de 2007
Ultima resposta 30 de out. de 2007
Respostas 8
Participantes 6