Pourquoi est-impression “B” considérablement plus lente que l'impression de “#”?

J'ai produit de 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 derrière la radicalement différentes durées d'exécution?


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

Comme les autres, qui ont souligné qu'il travaille pour eux normalement, j'ai essayé Ideone.com par exemple, et les deux morceaux de code à exécuter à la même vitesse.

Conditions De Test:

  • J'ai couru ce test à partir de Netbeans 7.2, avec la sortie de sa console
  • J'ai utilisé System.nanoTime() pour les mesures
  • Essayez de changer de rand.nextInt(4) == 0 à i < 250 pour éliminer l'effet du générateur aléatoire. Vous pourriez manquer de l'entropie qui ralentit la génération aléatoire
  • Les deux semblent fonctionner pour la même quantité de temps sur ma machine, ~4 secondes.
  • Alors direction de la prévision serait un coup. Quelque chose comme un changement d' rand.nextInt(4)==0 à i%4==0 serait mieux (en termes d'éviter la direction de la prévision d'accélérer le processus)
  • si vous suggérez que l'impression B prend plus de temps que l'impression de #....pourquoi ne pas vous essayez d'imprimer tous les B & tous # plutôt que de compter sur la variable aléatoire r
  • À travers trois essais de chaque ('B' vs '#') je suis entre le 36 et 38 secondes (arrondi à l'inférieur). J'ai ajouté startTime et endTime champs qui font Système.currentTimeMillis avant et après la boucle de mon calendrier. Je vais suggérer qu'il y a un problème local (moteur d'exécution, le processeur, les hélicoptères noirs).
  • Basé sur la accepté de répondre, tu n'a apparemment pas essayer de l'exécuter avec la sortie redirigée vers un fichier ou /dev/null.
  • Random() n'est pas un cryptographiques majeures rng et donc ne pas utiliser le pool d'entropie.
  • matrice, @FrancescoMenzani? IMO il n'a pas de sens ici; est en fait la question n'est pas un peu plus facile à trouver, ne décrit pas son champ d'application mieux, ajoute juste du bruit.
  • Je ne pouvais pas trouver tout imprimer tag spécifique à System.out, mais je pense que système.out elle sera de représenter cette partie de la question tout à fait bonne.
  • J'ai essayé de courir le même code sur mon système. Dans chacun des 20 essais, l'impression de "#" de code est 3 à 5 fois plus LENTE que l'impression de "B".

InformationsquelleAutor Kuba Spatny | 2014-02-21