2012-08-06 7 views
10

私はこのような何かをやっている:基本的に文字列をシステムに出力する最も速い方法は何ですか?

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

、私は、改行で区切られた各結果を整数と出力10K-100K時間に関する文字列を計算し、その後System.outに結果を記述する必要があります。

これを達成する最も速い方法は何ですか?

+2

いくつかの方法を試して、それらをプロファイルします。 – John3136

答えて

19

(これは速く5-10xすることができます)提案していただきありがとうございます。

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)); 
    } 

} 

結果::

Environment1
のSystem.out.println:482
のStringBuilder:210
なBufferedOutputStream:86
BufferedWriterの:202

私はそれらを比較するためのテストプログラムを作成しました 環境2
System.out.println:1763
のStringBuilder:45
なBufferedOutputStream:76
BufferedWriterの:34

提案は、すべてのSystem.out.printlnよりも良好に機能しました。 BufferedOutputStreamは、両方のテスト環境でうまくいくので最も安全な選択肢と思われます。しかし、BufferedWriterはおそらく高速です。

誰かがアイディアを持っている場合は、さらに提案を投稿してください。私は誰かがそれが速く行くことができると確信しています:)

2

I/O操作は、メモリ内処理(Integerの解析など)に比べて非常に遅いことに注意してください。 だから、私は「事前に」文字列全体を作成することを提案すると、その後(その可能ならば当然の)一度だけ、それをプリントアウト:

StringBuilder sb = new StringBuilder();

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

バッファリングなど、さまざまな技術があります。あなたが使用しているが、私はあなたがこの大量のデータについては

+0

を使用するか、BufferedWriterを使用して同じ効果を得ます。 – Thilo

+0

ありがとう、私はそれらをすべて比較するテストプログラムを作成します。 – CodeSmith

+0

Integer.parseInt(String) –

4

、を助け、最も基本的なSystem.out.println

希望に滞在することを好むことを前提としていた出力ストリームのレベルは効率が悪く、 がバッファリングをうまく行っていない可能性があります。その場合は、BufferedOutputStreamまたはBufferedWriterを使用できます。

0

System.outに書き込むのが最も遅いのは、書いている内容を表示するのにかかる時間です。すなわち、あなたが書くすべてのラインについて、コンピュータはフォントを使用して情報をピクセルに変換し、ライン全体をスクロールしなければならない。これは、あなたがテキストを表示するために何をしているのかよりもはるかに多くの作業です。

があなたの代わりに、ファイルへの書き込み少ない(通常は最高のアイデア)

  • を書く

    • によってコンソールへの書き込みを高速化することができ
  • +0

    の代わりに 'Integer.toString(int)'を意味すると思います。または、ストレージデバイスを切り捨てるヌルデバイス(例えば/ dev/null)に書き込んでください。 –

    関連する問題