Saltar al contenido

Java: efecto System.out en el rendimiento

Este team de trabajo ha estado por horas investigando soluciones a tu duda, te brindamos la respuestas así que nuestro deseo es serte de gran apoyo.

Solución:

Puede tener un impacto en el rendimiento de su aplicación. La magnitud variará según el tipo de hardware en el que se esté ejecutando y la carga en el host.

Algunos puntos en los que esto puede traducirse en rendimiento:

-> Como dijo Rocket boy, println está sincronizado, lo que significa que incurrirá en bloquear la sobrecarga en el encabezado del objeto y puede causar cuellos de botella en el subproceso dependiendo de su diseño.

-> La impresión en la consola requiere tiempo de kernel, el tiempo de kernel significa que la CPU no se ejecutará en modo de usuario, lo que básicamente significa que su CPU estará ocupada ejecutando el código del kernel en lugar del código de su aplicación.

-> Si ya está registrando esto, eso significa más tiempo de kernel para E/S, y si su plataforma no es compatible con E/S asíncrona, esto significa que su CPU podría estancarse en esperas ocupadas.

De hecho, puede probar y comparar esto y verificarlo usted mismo.

Hay formas de salirse con la suya como, por ejemplo, tener una E/S realmente rápida, una máquina enorme para un uso dedicado tal vez y bloqueo sesgado en sus opciones de JVM si el diseño de su aplicación no será multiproceso en la impresión de esa consola.

Como todo en el rendimiento, todo depende de su hardware y prioridades.

Recientemente estuve probando (leyendo y) escribiendo archivos de texto grandes (1-1.5 gb), y descubrí que:

PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(java.io.FileDescriptor.out), "UTF-8"), 512));
out.println(yourString);
//...
out.flush();

es de hecho casi 250% más rápido que

System.out.println(yourString);

Mi programa de prueba primero leyó alrededor de 1 gb de datos, lo procesó un poco y lo emitió en un formato ligeramente diferente.

Resultados de la prueba (en Macbook Pro, con lectura y escritura de SSD usando el mismo disco):

  • salida-de-datos-a-salida-del-sistema > salida.txt => 1min32seg
  • datos-escritos-en-archivo-en-java => 37seg
  • salida-estándar-de-escritor-de-datos-escritos-en-búfer > salida.txt => 36 seg

Probé con múltiples búferes de entre 256 y 10k, pero eso no pareció importar.

Así que tenga en cuenta que si está creando herramientas de línea de comandos de Unix con Java donde la salida está destinada a ser dirigida o canalizada a otro lugar, ¡no use System.out directamente!

System.out.println()

está sincronizado.

 public void println(String x) {
    synchronized (this) 
        print(x);
        newLine();
    

Si varios subprocesos escriben en él, su rendimiento se verá afectado.

Aquí puedes ver las reseñas y valoraciones de los lectores

Nos encantaría que puedieras dar difusión a esta noticia si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *