J'ai la fonction Java suivante, pour compter les éléments communs dans deux tableaux triés. Notez la ligne avec le point d'interrogation.
public static int overlap(int[] a, int[] b)
{
int i = 0, j = 0;
int res = 0;
while(i < a.length && j < b.length)
{
if(a[i] > b[j])
j ++;
else if(a[i] < b[j])
i ++;
else if(a[i] == b[j]) // ?
{
res ++;
i ++;
j ++;
}
}
return res;
}
Il est clair que la dernière déclaration if n'a pas besoin d'être là : à ce stade, nous savons que les deux valeurs sont égales. Cependant, lorsque je teste la vitesse (je vérifiais si l'ordre des vérifications faisait une différence), la méthode avec la vérification superflue est invariablement plus rapide que celle sans vérification (parfois par un facteur de deux).
Que se passe-t-il ici ? Une optimisation mystérieuse ? Ai-je oublié quelque chose d'évident ? J'utilise le compilateur stand, version 1.8. Je ne peux pas lire le bytecode, donc je ne sais pas ce qui se passe sous le capot.
Voici une classe de test complète : https://gist.github.com/pbloem/1523283211454ec58ce9c5b45204eebd
Bytecode : https://gist.github.com/pbloem/ce4f6758f0bb1424c155c26e83ca88a1