2994 votes

Pourquoi l'impression de "B" est-elle nettement plus lente que celle de "#" ?

J'ai généré deux matrices de 1000 x 1000 :

Première Matrice : O et # .
Deuxième matrice : O et B .

En utilisant le code suivant, la première matrice a pris 8,52 secondes :

Random r = new Random();
for (int i = 0; i < 1000; i++) {
    for (int j = 0; j < 1000; j++) {
        if(r.nextInt(4) == 0) {
            System.out.print("O");
        } else {
            System.out.print("#");
        }
    }

   System.out.println("");
 }

Avec ce code, la deuxième matrice a pris 259,152 secondes :

Random r = new Random();
for (int i = 0; i < 1000; i++) {
    for (int j = 0; j < 1000; j++) {
        if(r.nextInt(4) == 0) {
            System.out.print("O");
        } else {
            System.out.print("B"); //only line changed
        }
    }

    System.out.println("");
}

Quelle est la raison de ces différences spectaculaires de temps d'exécution ?


Comme suggéré dans les commentaires, l'impression seulement System.out.print("#"); prend 7,8871 secondes, alors que System.out.print("B"); donne still printing... .

Comme d'autres qui ont fait remarquer que cela fonctionne pour eux normalement, j'ai essayé Ideone.com par exemple, et les deux morceaux de code s'exécutent à la même vitesse.

Conditions d'essai :

  • J'ai exécuté ce test depuis Netbeans 7.2, avec la sortie dans sa console
  • J'ai utilisé System.nanoTime() pour les mesures

4255voto

T.J. Crowder Points 285826

Pure spéculation c'est que vous utilisez un terminal qui tente de faire enveloppement des mots plutôt que d'envelopper des caractères, et traite B comme un caractère de mot mais # comme un caractère non verbal. Ainsi, lorsqu'il arrive à la fin d'une ligne et qu'il cherche un endroit où rompre la ligne, il voit un caractère # presque immédiatement et s'y brise joyeusement ; alors qu'avec la B il doit continuer à chercher plus longtemps, et peut avoir plus de texte à envelopper (ce qui peut être coûteux sur certains terminaux, par exemple, en sortant des espaces arrière, puis en sortant des espaces pour écraser les lettres à envelopper).

Mais c'est une pure spéculation.

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