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


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 à compléter:

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 à compléter:

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 les temps d'exécution radicalement différents?


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

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

Conditions de test:

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

2414
2018-02-21 23:45


origine


Réponses:


Spéculation pure est que vous utilisez un terminal qui tente de faire mot-emballage plutôt que d'emballer les personnages et traite B en tant que caractère de mot, mais # en tant que caractère non-mot. Donc, quand il atteint la fin d'une ligne et cherche un endroit pour casser la ligne, il voit un # presque immédiatement et heureusement se brise là; alors qu'avec le B, il doit continuer à chercher plus longtemps, et peut avoir plus de texte à emballer (ce qui peut être coûteux sur certains terminaux, par exemple, produire des espaces arrière, puis produire des espaces pour écraser les lettres en cours d'emballage).

Mais c'est de la pure spéculation.


3720
2018-04-03 15:01



J'ai effectué des tests sur Eclipse vs Netbeans 8.0.2, tous deux avec Java version 1.8; j'ai utilisé System.nanoTime() pour les mesures.

Éclipse:

J'ai eu le en même temps dans les deux cas - autour 1.564 secondes.

Netbeans:

  • En utilisant "#": 1.536 secondes
  • En utilisant "B": 44.164 secondes

Donc, il semble que Netbeans a une mauvaise performance sur l'impression à la console.

Après plus de recherches, j'ai réalisé que le problème est enroulement de ligne du tampon max de Netbeans (il n'est pas limité à System.out.println commande), démontré par ce code:

for (int i = 0; i < 1000; i++) {
    long t1 = System.nanoTime();
    System.out.print("BBB......BBB"); \\<-contain 1000 "B"
    long t2 = System.nanoTime();
    System.out.println(t2-t1);
    System.out.println("");
}

Les résultats temporels sont inférieurs à 1 milliseconde à chaque itération sauf toutes les cinq itérations, lorsque le résultat du temps est d'environ 225 millisecondes. Quelque chose comme (en nanosecondes):

BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
.
.
.

Etc..

Résumé:

  1. Eclipse fonctionne parfaitement avec "B"
  2. Netbeans a un problème de retour à la ligne qui peut être résolu (car le problème ne se produit pas dans eclipse) (sans ajouter d'espace après B ("B")).

148