¿Por qué la impresión "B" es dramáticamente más lenta que la impresión "#"?


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, intenté Ideone.com por ejemplo, y ambas piezas de código se ejecutan a la misma velocidad.

Condiciones de ensayo:

  • Ejecuté esta prueba desde Netbeans 7.2 , con la salida en su consola
  • Usé System.nanoTime() para mediciones
Author: chŝdk, 2014-02-22

2 answers

Pure speculation es que estás usando una terminal que intenta hacer envoltura de palabras en lugar de envoltura de caracteres, y trata B como un carácter de palabra pero # como un carácter no de palabra. Así que cuando llega al final de una línea y busca un lugar para romper la línea, ve un # casi inmediatamente y felizmente se rompe allí; mientras que con el B, tiene que seguir buscando por más tiempo, y puede tener más texto para envolver (lo que puede ser costoso en algunos terminales, p., salida de backspaces, luego salida de espacios para sobrescribir las letras que se envuelven).

Pero eso es pura especulación.

 3762
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-13 07:16:29

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

Eclipse:

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

Netbeans:

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

Por lo tanto, parece que Netbeans tiene un mal rendimiento al imprimir en la consola.

Después de más investigación me di cuenta de que el problema es line-wrapping del búfer 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 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í sucesivamente..

Resumen:

  1. Eclipse funciona perfectamente con "B"
  2. Netbeans tiene un problema de envoltura de línea que se puede resolver (porque el problema no ocurre en eclipse) (sin agregar espacio después de B ("B")).
 158
Author: Roy Shmuli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-17 21:34:55