Get faster console output (System.out.println() replacement)Tag(s): IO


If your program is doing a lot printing to the console using System.out.println() then it is possible to get a good performance boost by using an alternative to do the console output.

By default, System.out.print() is only line-buffered and does a lot work related to Unicode handling. Because of its small buffer size, System.out.println() is not well suited to handle many repetitive outputs in a batch mode. Each line is flushed right away. If your output is mainly ASCII-based then by removing the Unicode-related activities, the overall execution time will be better.

Consider this program :

import java.io.BufferedWriter;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

public class Test {
   public static void main(String...args) throws Exception {
     long start = System.currentTimeMillis();
     for (int i = 0; i < 1000000; i++) {
       System.out.print("abcdefghijk ");
       System.out.print(String.valueOf(i));
       System.out.print('\n');
     }
     System.err.println("Loop time: " +
       (System.currentTimeMillis() - start));
   }
}
The result is
>java Test >NUL
Loop time: 7000

Now, rewrite this program to use a 512-bytes buffer and specify the ASCII as character-encoding to be used.

import java.io.BufferedWriter;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

public class Test {
   public static void main(String...args) throws Exception {
     BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new
         FileOutputStream(java.io.FileDescriptor.out), "ASCII"), 512);
     long start = System.currentTimeMillis();
     for (int i = 0; i < 1000000; i++) {
       out.write("abcdefghijk ");
       out.write(String.valueOf(i));
       out.write('\n');
     }
     out.flush();
     System.err.println("Loop time: " +
       (System.currentTimeMillis() - start));
   }

}
The result is
>java Test >NUL
Loop time: 672
Note that your result will vary depending on your machine/java version but the performance gain should in the same magnitude.

blog comments powered by Disqus