java - ¿Por qué la impresión “B” es dramáticamente más lenta que la impresión “#”?
performance loops (2)
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:
- Eclipse funciona perfectamente con "B"
- 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")).
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
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.