for(int i = 0, I = set.size(); i < I; i++) plus rapide?
Bonjour à tous,
Voilà j'ai vu ça dans le code de ma boite et je me demandais si cela représentait réellement un gain de performances :
Code:
1 2 3 4 5
| Set<Long> s = new HashSet<Long>();
for(i = 0, I = s.size(); i < I; i++) {
...
} |
J'ai donc fait un petit code de test et les résultats s'avèrent plutôt aléatoires :
Citation:
s.size() = 3719 ms
I = 4187 ms
Le résultat ne donne pas vraiment l'avantage à l'une ou l'autre méthode. Cela dit ma machine est assez instable et rame, donc j'aurais voulu savoir si l'un d'entre vous connaissait le mécanisme de Java concernant cet aspect particulier des boucles?
Mon sentiment est que la machine virtuelle stocke dans sa mémoire la variable s.size() afin de n'avoir à appeler la fonction qu'une seule fois.
Je vous colle le code du jeu de test que j'ai utilisé :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| public static void main(String[] args) throws IOException {
Set<Long> s = new HashSet<Long>();
long l = 0;
long i, I = 0;
final int OCCURS = 50;
for(i = 0; i < 999999; i++) {
s.add(i);
}
l = System.currentTimeMillis();
for(int j = 0; j < OCCURS; j++) {
for(i = 0; i < s.size(); i++) {
if(i % 400000 == 0)
System.out.print(i + " ");
}
}
System.out.print("\n");
l = System.currentTimeMillis() - l;
System.out.println("s.size() = " + l + " ms");
l = System.currentTimeMillis();
for(int j = 0; j < OCCURS; j++) {
for(i = 0, I = s.size(); i < I; i++) {
if(i % 10000 == 0)
System.out.print(i + " ");
}
}
System.out.print("\n");
l = System.currentTimeMillis() - l;
System.out.println("I = " + l + " ms");
} |
Merci d'avance d'éclairer ma lanterne :D