2012-08-06 10 views
10

que estoy haciendo algo como esto:¿Cuál es la forma más rápida de enviar una cadena al sistema?

for (int i = 0; i < 100000; i++) { 
    System.out.println(i); 
} 

Básicamente, puedo calcular un entero y salida de una cadena sobre los tiempos de 10K-100K y luego necesito escribir el resultado en System.out, cada resultado separados por un salto de línea .

¿Cuál es la forma más rápida de lograr esto?

+2

intente un par de métodos y perfílleselos. – John3136

Respuesta

19

Gracias por las sugerencias. He creado un programa de prueba para compararlos:

import java.io.BufferedOutputStream; 
import java.io.BufferedWriter; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.lang.StringBuilder; 

public class systemouttest { 

    public static void main(String[] args) throws Exception { 

     long starttime = System.currentTimeMillis(); 
     for (int i = 0; i < 100000; i++) { 
      System.out.println(i); 
     } 
     long printlntime = System.currentTimeMillis(); 

     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < 100000; i++) { 
      sb.append(i + "\n"); 
     } 
     System.out.print(sb.toString()); 
     long stringbuildertime = System.currentTimeMillis(); 

     OutputStream out = new BufferedOutputStream (System.out); 
     for (int i = 0; i < 100000; i++) { 
      out.write((i + "\n").getBytes()); 
     } 
     out.flush(); 
     long bufferedoutputtime = System.currentTimeMillis(); 

     BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out)); 
     for (int i = 0; i < 100000; i++) { 
      log.write(i + "\n"); 
     } 
     log.flush(); 
     long bufferedwritertime = System.currentTimeMillis(); 

     System.out.println("System.out.println: " + (printlntime - starttime)); 
     System.out.println("StringBuilder: " + (stringbuildertime - printlntime)); 
     System.out.println("BufferedoutputStream: " + (bufferedoutputtime - stringbuildertime)); 
     System.out.println("BufferedWriter: " + (bufferedwritertime - bufferedoutputtime)); 
    } 

} 

Resultados:

Entorno1
System.out.println: 482
StringBuilder: 210
BufferedOutputStream: 86
BufferedWriter: 202

Environment2
System.out.println: 1763
StringBuilder: 45
BufferedOutputStream: 76
BufferedWriter: 34

Las sugerencias todos funcionó mejor que System.out.println. BufferedOutputStream parece ser la opción más segura, ya que funcionó bien en ambos entornos de prueba. Buffered Writer quizás sea más rápido.

Por favor, publique más sugerencias si alguien tiene algunas ideas. Estoy seguro de que alguien puede hacerlo ir más rápido :)

2

Tenga en cuenta que las operaciones de E/S son muy lentas en comparación con el procesamiento en la memoria (por ejemplo, el análisis de Integer). Por lo tanto, yo propondría usted para crear toda la cadena 'de antemano' y luego imprimirlo sólo una vez (por supuesto, si su posible):

StringBuilder sb = new StringBuilder();

for(int i = 0 ; i < 100000; i++) { sb.append(i).append("\n");} 
String printMe = sb.toString(); 
System.out.println(printMe); 

Existen varias técnicas como amortiguar el el nivel de flujo de salida que está utilizando, pero supongo que prefiere quedarse con el más básico System.out.println

espero que esto ayude

+0

o use un BufferedWriter para obtener el mismo efecto. – Thilo

+0

Gracias por las sugerencias, crearé un programa de prueba para compararlas todas. – CodeSmith

+0

Creo que quiere decir 'Integer.toString (int)' en lugar de usar 'Integer.parseInt (String)' –

4

para gran cantidad de datos, System.out.println podría ser ineficiente, ya que no hace hacer un buen almacenamiento en búfer. En ese caso, puede usar un BufferedOutputStream o un BufferedWriter.

0

La parte más lenta de escribir en System.out es el tiempo necesario para mostrar lo que está escribiendo. es decir, por cada línea que escriba, la computadora debe convertir la información en píxeles utilizando una fuente y desplazarse por una línea completa. Esto es mucho más trabajo que lo que sea probable que haga para mostrar el texto.

se puede acelerar por escrito a la consola mediante

  • escribir menos (por lo general la mejor idea)
  • escribir en un archivo en vez (Esto puede ser más rápido 5-10x)
+0

o escribir en un dispositivo nulo (por ejemplo,/dev/null), que corta la capa de almacenamiento. –

Cuestiones relacionadas