8 votes

Pourquoi la prédiction de branches est-elle plus rapide que pas de branche du tout ?

Inspiré par cette question : Pourquoi est-il plus rapide de traiter un tableau trié qu'un tableau non trié ?

J'ai écrit ma propre expérience de prédiction de branchement :

public class BranchPrediction {
    public static void main(final String[] args) {
        long start;
        long sum = 0;

        /* Pas de branchement */
        start = System.nanoTime();
        sum = 0;
        for (long i = 0; i < 10000000000L; ++i)
            sum += i;
        System.out.println(System.nanoTime() - start);
        System.out.println(sum);

        /* Avec branchement */
        start = System.nanoTime();
        sum = 0;
        for (long i = 0; i < 10000000000L; ++i)
            if (i >= 0)
                sum += i;
        System.out.println(System.nanoTime() - start);
        System.out.println(sum);

        /* Pas de branchement (encore) */
        start = System.nanoTime();
        sum = 0;
        for (long i = 0; i < 10000000000L; ++i)
            sum += i;
        System.out.println(System.nanoTime() - start);
        System.out.println(sum);

        /* Avec branchement (encore) */
        start = System.nanoTime();
        sum = 0;
        for (long i = 0; i < 10000000000L; ++i)
            if (i >= 0)
                sum += i;
        System.out.println(System.nanoTime() - start);
        System.out.println(sum);
    }
}

Le résultat me laisse perplexe : selon la sortie du programme, la boucle avec un branchement est systématiquement plus rapide que les boucles sans branchement.

Exemple de sortie :

7949691477
-5340232226128654848
6947699555
-5340232226128654848
7920972795
-5340232226128654848
7055459799
-5340232226128654848

Pourquoi est-ce le cas ?

Éditer :

3voto

Après avoir effectué la même expérience sur mes autres machines (serveurs et postes de travail Intel), je peux conclure que le phénomène que j'ai rencontré est spécifique à ce CPU de laptop (Intel i7 Q740M).

\==== Édition 6 mois plus tard ====

Découvrez ceci: http://eli.thegreenplace.net/2013/12/03/intel-i7-loop-performance-anomaly/

2voto

Dejan Points 866

Gardez à l'esprit que le JVM optimise l'exécution en interne, et qu'il y a des caches à l'intérieur de votre PC qui rendent le calcul plus rapide. Étant donné que vous avez un processeur si puissant (de nombreux noyaux indépendants), cela n'est pas étrange. Notez également qu'il y a du code qui s'exécute sous le code Java qui se traduit en code machine de votre PC. Tapez simplement un code aussi optimisé que possible, laissez le JVM s'en préoccuper.

ÉDIT : Les machines et le matériel aiment les grosses charges, elles fonctionnent avec plus d'efficacité. Surtout les caches.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X