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, la impresión 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 el resultado en su consola
- Solía
System.nanoTime()
para mediciones
java
performance
loops
for-loop
system.out
Kuba Spatny
fuente
fuente
Respuestas:
La especulación pura es que está utilizando un terminal que intenta hacer un ajuste de palabras en lugar de un ajuste de caracteres, y lo trata
B
como un carácter de palabra pero#
como un carácter que no es de palabra. Entonces, cuando llega al final de una línea y busca un lugar para romper la línea, ve un salto#
casi inmediato y feliz allí; mientras que con elB
, tiene que seguir buscando durante más tiempo y puede tener más texto para ajustar (lo que puede ser costoso en algunos terminales, por ejemplo, generar espacios de retroceso, luego generar espacios para sobrescribir las letras que se envuelven).Pero eso es pura especulación.
fuente
B
resuelva.System.out.println
no hace el wordwrapping; Lo que estaba produciendo era el ajuste de palabras (y el bloqueo, así queSystem.out.println
tuve que esperar).Realicé pruebas en Eclipse vs Netbeans 8.0.2, ambas con Java versión 1.8; Solía
System.nanoTime()
para las mediciones.Eclipse:
Obtuve el mismo tiempo en ambos casos , alrededor de 1.564 segundos .
Netbeans:
Por lo tanto, parece que Netbeans tiene un mal rendimiento en la impresión a la consola.
Después de más investigación, me di cuenta de que el problema es el ajuste de línea del búfer máximo de Netbeans (no está restringido al
System.out.println
comando), demostrado por este código: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 así (en nanosegundos):
Y así..
Resumen:
fuente
Sí, el culpable es definitivamente envolver palabras. Cuando probé sus dos programas, NetBeans IDE 8.2 me dio el siguiente resultado.
Mirando de cerca su código, ha utilizado un salto de línea al final del primer bucle. Pero no usaste ningún salto de línea en el segundo bucle. Entonces va a imprimir una palabra con 1000 caracteres en el segundo bucle. Eso causa un problema de ajuste de palabras. Si usamos un carácter que no es palabra "" después de B, se tarda solo 5.35 segundos en compilar el programa. Y si usamos un salto de línea en el segundo bucle después de pasar 100 valores o 50 valores, solo lleva 8.56 segundos y 7.05 segundos respectivamente.
Otro consejo es que cambie la configuración de NetBeans IDE. En primer lugar, vaya a Herramientas NetBeans y haga clic en Opciones . Después de eso, haga clic en Editor y vaya a la pestaña Formato . Luego, seleccione Cualquier lugar en la opción de ajuste de línea . Tomará casi 6.24% menos tiempo compilar el programa.
fuente