java - ¿Por qué la impresión “B” es dramáticamente más lenta que la impresión “#”?




performance loops (2)

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

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 investigación, me di cuenta de que el problema es line-wrapping de line-wrapping 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")).

La especulación pura es que estás utilizando un terminal que intenta ajustar la word-wrapping lugar de la del carácter, y trata a B como un carácter de la palabra pero # como un carácter que no es de la palabra. 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 de retroceso y luego generar espacios para sobrescribir las letras envueltas).

Pero eso es pura especulación.







system.out