Ingresar:

Concurso programacion :: Blog :: Mejorando el mecanismo de mostrar en Java

July 22, 2008

Esta es una pequeña comparación de mostrar 100000 veces "Hola" por pantalla de la forma tradicional (usando System.out.println) vs. una mejor forma (usando PrintWriter).

PRIMERA FORMA: Usando System.out.println 

  public class Prueba1   {       public static void main(String[] args)       {           long ini = System.nanoTime();                     for (int i = 0; i < 100000; i++)           {               System.out.println("Hola "+i );           }                     long fin = System.nanoTime();                     System.out.println("Tarda "+(fin-ini)/1000000000+" s.");       }   }     

SEGUNDA FORMA: Usando PrintWriter

  import java.io.PrintWriter;   public class Prueba2   {        public static void main(String[] args)       {           long ini = System.nanoTime();                     PrintWriter out = new PrintWriter(System.out);           for (int i = 0; i < 100000; i++)           {               out.println("Hola "+i);           }           out.flush();           long fin = System.nanoTime();                     System.out.println("Tarda "+(fin-ini)/1000000000+" s.");       }   }     

La diferencia es 5 a 1. La segunda forma de mostrar en Java resultó ser más eficiente que la forma tradicional (al menos para mi), de hacer mostrar.

Compruébenlo Uds. mismos.

NOTA ADICIONAL

El mensaje que se muestra al final en ambas pruebas es cuanto ha tardado el programa en segundos.

Palabras clave: concurso, java

Enviado por Cristian Denis Mamani Torres @ Concurso programacion



Comentarios

  1. Con el StringBuilder se logra un rendimiento bastante similar:

    package TestJava;
    import java.io.PrintWriter;

    public class Prueba2
    {   
        public static void main(String[] args) 
        {
            long ini = System.nanoTime();
            StringBuilder sb = new StringBuilder();      
            for (int i = 0; i < 100000; i++) 
            {
              sb.append("hola");
              sb.append(i);
              sb.append("\n");
            }
            System.out.println(sb);
            long fin = System.nanoTime();
            System.out.println("Tarda "+(fin-ini)/1000000+" ms.");
        }
    }

    user iconErnesto Bascón Pantoja on Tuesday, 22 July 2008, 10:30 BOT # |

  2. Hey cristian tienes razon

    hice la prueba y con el clasico System.out.println tarda 69 seg en mi pc

    y con el PrintWriter tardo solo 12 segundos.

    Ahora ya veo que claudia tiene razon http://ajayu.memi.umss.edu.bo/claudiau/weblog/chistesito 

    jajaaa Laughingpero no es cierto :P

    user iconDaniel on Tuesday, 22 July 2008, 11:10 BOT # |

  3. Hace casi un año: http://ajayu.memi.umss.edu.bo/omegaman/weblog/performance-de-java-es

    user iconPablo Azero on Wednesday, 23 July 2008, 00:56 BOT # |

  4. Por mi experiencia, Ernesto apunta a algo que es más eficiente, enviar varias veces a un flujo tarda mucho más que enviar toda una cadena unida de una sola vez. Sin embargo no olviden que en los concursos también debe medirse la memoria utilizada, es decir, si concatenamos y logramos una GRAN cadena, entonces puede que nos pasemos del tamaño permisible en el concurso :).

    user iconWilfredo Vargas Almendras on Wednesday, 23 July 2008, 10:20 BOT # |

  5. hice la prueba con el juez virtual acm.timus.ru    la verdad no existe diferencia en tiempos de ejecucios, al utilizar System.out.println  y PrintWriter , bueno esto se debe a que las salidas de las respuestas son pequeñas.

    pero para imprimir  en cantidad es recomendable utilizar PrintWriter Wink

    user iconAntonio Mamani on Wednesday, 23 July 2008, 11:12 BOT # |

  6. Willy at # 4, test the tests... y verás la diferencia...

    a propósito, cuando test the net?

    user iconCristian Denis Mamani Torres on Wednesday, 23 July 2008, 21:51 BOT # |

  7. Como calcular el tiempo de esto?   import java.awt.Graphics;   import java.awt.Graphics2D;   import java.awt.Font;   import java.awt.Color;   import java.awt.RenderingHints;   import java.awt.Dimension;   import javax.swing.JPanel;   import javax.swing.JFrame;   public class Hola1000 extends JPanel   {   static Dimension d;   public void Hola1000()   {}   public void paint( Graphics g )   {   Graphics2D g2=(Graphics2D)g;   g2.clearRect(0,0,getSize().width,getSize().height);   g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,   RenderingHints.VALUE_ANTIALIAS_ON);   int N=1000;   for (int i = 0; i < N; i++)   {   g2.setFont(new Font("Helvetica",Font.BOLD,(int)(50*Math.random())));   g2.setColor(new Color(((int)(Math.random()*255)),   ((int)(Math.random()*255)),   ((int)(Math.random()*255))));   g2.drawString("Hola "+i,(int)(d.width*Math.random()),(int)(d.height*Math.random()));   }   }   public static void main(String[] args)   {   long ini = System.nanoTime();   Ventana v = new Ventana();   long fin = System.nanoTime();   System.out.println("Tarda "+(fin-ini)/1000000000+" s.");   }   static class Ventana extends JFrame   {   public Ventana()   {   super.setTitle("Hola JFrame");   d = java.awt.Toolkit.getDefaultToolkit().getScreenSize();   setSize(d);   this.getContentPane().add(new Hola1000());   setBackground(Color.white);   setVisible(true);   }   }   }    

    user iconHappyFaceDead on Thursday, 24 July 2008, 09:55 BOT # |

  8. Bueno no deberias hacer esto:

    System.out.println("Tarda "+(fin-ini)/1000000000+" s.");    

    solo

    System.out.println("Tarda "+(fin-ini)+" s.");   

    y tendrás el tiempo en milisegundos :)

     
    SALUDOS 

    user iconWilfredo Vargas Almendras on Thursday, 24 July 2008, 10:55 BOT # |

  9. (fin - ini) devuelve la diferencia en nanosegundos. ((fin - ini)/1000000) es entre milisegundos :)

    user iconErnesto Bascón Pantoja on Thursday, 24 July 2008, 11:37 BOT # |

  10. No es la mejor aproximacion pero algo es algo Laughing   import javax.swing.JFrame;   import javax.swing.JPanel;   import java.awt.Graphics2D;   import java.awt.Graphics;   import java.awt.Font;   import java.awt.Color;   import java.awt.RenderingHints;   import java.awt.Dimension;   import javax.swing.UIManager;   public class Prueba3 extends JPanel   {   static Dimension d;   static long ini;   static long fin;   public void Prueba3()   {}   public void paint( Graphics g )   {   Graphics2D g2=(Graphics2D)g;   g2.clearRect(0,0,getSize().width,getSize().height);   g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,   RenderingHints.VALUE_ANTIALIAS_ON);   int N=100000;   for (int i = 0; i < N; i++)   {   g2.setFont(new Font("Helvetica",Font.BOLD,(int)(50*Math.random())));   g2.setColor(new Color(((int)(Math.random()*255)),   ((int)(Math.random()*255)),   ((int)(Math.random()*255))));   g2.drawString("Hola "+i,(int)(getSize().width*Math.random()),(int)(getSize().height*Math.random()));   if(i==(N-1))   {   fin = System.nanoTime();   double deltaTiempo = (fin-ini);   System.out.println("Tarda "+(deltaTiempo)+" nano segundos.");   System.out.println("Tarda "+(deltaTiempo/1000000)+" mili segundos.");   System.out.println("Tarda "+(deltaTiempo/1000000000)+" segundos.");   }   else   if(i==0)   ini = System.nanoTime();   }   }   public static void main(String[] args)   {   Ventana v = new Ventana();   }   static class Ventana extends JFrame   {   public Ventana()   {   super.setTitle("Hola JFrame");   d = java.awt.Toolkit.getDefaultToolkit().getScreenSize();   setSize(d);   this.getContentPane().add(new Prueba3());   setBackground(Color.white);   setVisible(true);   }   }   }    

    user iconHappyFaceDead on Thursday, 24 July 2008, 12:45 BOT # |

  11. # 9. Si, tienes razón, pequeña confusión con el parámetro del sleep del Thread :S,en milisegundos, mucho trabajar sobre la misma cosa afecta hmmmmm .. , gracias por la correción.

    user iconWilfredo Vargas Almendras on Thursday, 24 July 2008, 14:48 BOT # |

Añadir un comentario

Tu texto de comentario

Tu nombre

Por favor ingresa el código de la imagen

Security Code