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".
Vous devez vous connecter pour publier un commentaire.
De la Pure spéculation est que vous utilisez un terminal qui tente de faire le mot de l'emballage- plutôt que le caractère de l'habillage, et traite
B
comme un caractère de mot mais#
comme un caractère non alphabétique. Alors, quand il atteint la fin d'une ligne et cherche un endroit pour casser la ligne, il voit un#
presque immédiatement, et heureusement break; tandis qu'avec leB
, il a de garder à la recherche pour plus, et peuvent avoir plus de texte pour envelopper (qui peut être coûteux sur certains terminaux, par exemple, la sortie d'correction arrière, puis la sortie d'espaces pour remplacer les lettres de l'envelopper).Mais c'est de la pure spéculation.
B
elle n'en résout.System.out.println
dû attendre).J'ai fait des tests sur Eclipse vs Netbeans 8.0.2, à la fois avec la version Java 1.8;
J'ai utilisé
System.nanoTime()
pour les mesures.Eclipse:
J'ai eu le même temps sur les deux cas - autour de 1.564 secondes.
Netbeans:
Ainsi, il ressemble Netbeans a la mauvaise performance de l'impression à la console.
Après plus de recherche, j'ai réalisé que le problème est l'habillage de ligne de le tampon maximale de Netbeans (il n'est pas limité à
System.out.println
de commande), démontrée par ce code:Le temps, les résultats sont moins de 1 milliseconde à chaque itération à l'exception chaque cinquième itération, lorsque le temps est d'environ 225 ordre de la milliseconde. Quelque chose comme (en nanosecondes):
Et ainsi de suite..
Résumé: