Pregunta ¿Por qué la impresión "B" es mucho más lenta que la impresión de "#"?


Genere 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, solo impresión System.out.print("#"); toma 7.8871 segundos, mientras System.out.print("B"); da still printing....

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

Condiciónes de la prueba:

  • Ejecuté esta prueba de Netbeans 7.2, con la salida en su consola
  • solía System.nanoTime() para mediciones

2414
2018-02-21 23:45


origen


Respuestas:


Pura especulación es que estás usando una terminal que intenta hacer ajuste de palabras en lugar de envoltura de personajes, y trata B como un personaje de palabras, pero # como un personaje sin palabras. Entonces cuando llega al final de una línea y busca un lugar para romper la línea, ve una # casi de inmediato y felizmente se rompe allí; mientras que con el 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 que se envuelven).

Pero eso es pura especulación.


3720
2018-04-03 15:01



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

Eclipse:

tengo el mismo tiempo en ambos casos - alrededor 1.564 segundos.

Netbeans:

  • Utilizando "#": 1.536 segundos
  • Usando "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 línea de embalaje del buffer máximo de Netbeans (no está restringido a System.out.println comando), 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 inferiores a 1 milisegundo cada iteración excepto cada quinta iteración, cuando el resultado del tiempo es alrededor de 225 milisegundos. Algo así 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íneas que se puede resolver (porque el problema no ocurre en eclipse) (sin agregar espacio después de B ("B")).

148