it-swarm-es.com

¿Por qué imprimir "B" es dramáticamente más lento que imprimir "#"?

Generé dos matrices de 1000 x 1000:

Primera matriz: O y #.
Segunda Matriz: O y B.

Usando el siguiente código, la primera matriz tardó 8,52 segundos en completarse:

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("");
 }

Con este código, la segunda matriz tardó 259.152 segundos en completarse:

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("");
}

¿Cuál es la razón detrás de los tiempos de ejecución dramáticamente diferentes?


Como se sugiere en los comentarios, imprimir solo System.out.print("#"); toma 7.8871 segundos, mientras que System.out.print("B"); da still printing....

Como otros que señalaron que funciona para ellos normalmente, probé Ideone.com por ejemplo, y ambas piezas de código se ejecutan a la misma velocidad.

Condiciónes de la prueba:

  • Ejecuté esta prueba desde Netbeans 7.2 , con la salida en su consola
  • Utilicé System.nanoTime() para mediciones
2582
Kuba Spatny

Especulación pura es que está utilizando un terminal que intenta hacer Ajuste de palabra en lugar de ajuste de caracteres, y trata a B como un carácter de Word pero a # como un carácter que no es de Word. Entonces, cuando llega al final de una línea y busca un lugar para romper la línea, ve un # casi de inmediato y se rompe felizmente allí; mientras que con la B, tiene que seguir buscando durante más tiempo y puede tener más texto para envolver (lo que puede ser costoso en algunos terminales, por ejemplo, generar espacios en blanco y luego generar espacios para sobrescribir las letras que se están envolviendo).

Pero eso es pura especulación.

3903
T.J. Crowder

Realicé pruebas en Eclipse vs Netbeans 8.0.2, ambas con Java versión 1.8; Utilicé System.nanoTime() para las mediciones.

Eclipse:

Obtuve el mismo tiempo en ambos casos - alrededor de 1.564 segundos .

Netbeans:

  • Utilizando "#": 1.536 segundos
  • Utilizando "B": 44.164 segundos

Entonces, parece que Netbeans tiene un mal rendimiento en la impresión en la consola.

Después de más investigaciones, me di cuenta de que el problema es ajuste de línea del buffer máximo de Netbeans (no está restringido al comando System.out.println), demostrado por este código:

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("");
}

Los resultados de tiempo son menos de 1 milisegundo cada iteración, excepto cada quinta iteración , cuando el resultado de tiempo es de alrededor de 225 milisegundos. Algo como (en nanosegundos):

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

Y así..

Resumen:

  1. Eclipse funciona perfectamente con "B"
  2. Netbeans tiene un problema de ajuste de línea que se puede resolver (porque el problema no se produce en Eclipse) (sin agregar espacio después de B ("B")).
179
Roy Shmuli