[Resolvido] - Dúvida com Nested Loops - Performance

Boa Tarde Galera,

Estou com uma dúvida relacionada a Loops e Performance. Digamos que eu tenha um Loop e outro Loop dentro, o primeiro possui um valor maior que o do primeiro, digamos :

Loop1 = tamanho 10{
Loop2 = tamanho 5{
} 
}

A performance de iteração destes Loops seria maior ou menor que o contrário dos mesmo? Ou seja se for assim:

Loop1 = tamanho 5{
Loop2 = tamanho 10{
} 
}

Esta segunda iteração de Loops terá uma performance melhor ou pior?

Eu fiz um teste o seguinte, segue o código:

import java.util.*;
import java.lang.System;

public class Teste{

public static void main(String args[]){

long init;  
long end;  
long diff;  

init = System.nanoTime(); 
System.out.println("O valor inicial do init : " + init);
for (long i =0; i < 10000000000L; i++){
	long valorLoopUm = i;
  for (long j =0; j < 5000000000L; j++){
	long valorLoopDois = j;
} 
}  
end = System.nanoTime() ;  
System.out.println("O valor inicial do end : " + end);
diff = end - init;  
System.out.println("Demorou " + (diff / 1000000.0) + " milisegundos");  

//SEPARAÇAO DOS LACOS

init = System.nanoTime();  
System.out.println("O valor inicial do init segundo loop : " + init); 
for (long i =0; i < 5000000000L; i++){
	long valorLoopUm = i;
  for (long j =0; j < 10000000000L; j++){
	long valorLoopDois = j; 
} 
}  
end = System.nanoTime();  
System.out.println("O valor inicial do end segundo loop: " + end);
diff = end - init;  
System.out.println("Demorou " + (diff / 1000000.0) + " milisegundos");  

}
}

Os valores que eu peguei com esse teste foram:

O valor inicial do init : 29587814879759
O valor inicial do end : 29642180555702
Demorou 54365.675943 milisegundos
O valor inicial do init segundo loop : 29642202512106
O valor inicial do end segundo loop: 29673149140924
Demorou 30946.628818 milisegundos

Não sei se o meu código ficou bom o suficiente para entender e tals e nem sei se a minha explicação também, mas e ai galera, o que vocês acham?

Abss,

Zabimaru :smiley:

Amigo, na verdade quando um loop está dentro do outro, o algoritmo fica O(n^2) aproximado, mas neste caso é a mesma coisa, por que ele vai iterar sobre o primeiro loop 500x por ex, e a cada iteração dele, itera mais 1000x do outro, e vice-versa.

500 * 1000 = 1000 * 500 (A ordem dos fatores não altera o produto)

Fala Vinicius,

Eu estava achando isso também, então fui fazer um teste para ver e tem razão não altera mesmo em nada:

Acabei de fazer um teste com os Loops separados cada um em uma classe/arquivo diferente e deu o mesmo valor:

C:\Java>java Teste
O valor inicial do init : 31624186808042
O valor inicial do end : 31639219208462
Demorou 15032.40042 milisegundos

C:\Java>java Teste2
O valor inicial do init segundo loop : 31642213151865
O valor inicial do end segundo loop: 31657321223560
Demorou 15108.071695 milisegundos

Só alterei os valores para 100 000 e 50 000 respectivamente, e outra o teste não “vê” que o servidor pode estar com outros processos e tals, então pode alterar na performance também com vários processos rodando ao mesmo tempo.

Bom mas valeu ai pela resposta.

abss

Zabimaru =D