2012-08-06 195 views
10

我在做這樣的事情:什麼是向系統輸出字符串的最快方法?

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

基本上,我計算一個整數,輸出約10K-100K次字符串,然後需要將結果寫入到System.out,用換行分隔每個結果。

實現此目的的最快方法是什麼?

+2

嘗試幾種方法並描述它們。 – John3136 2012-08-06 05:53:52

回答

19

感謝您的建議。我創建了一個測試程序對它們進行比較:

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

} 

結果:

環境1
的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操作與內存處理(例如,整數解析)相比非常慢。 所以,我建議你「提前」打造整個字符串,然後(如果可能的當然)打印出來只有一次:

StringBuilder sb = new StringBuilder();

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

有很多種技術,如緩衝您正在使用的產出水平流,但我認爲你更喜歡留在最基本System.out.println

希望這有助於

+0

或使用BufferedWriter獲得相同的效果。 – Thilo 2012-08-06 06:02:02

+0

謝謝你的建議,我會創建一個測試程序來比較它們。 – CodeSmith 2012-08-06 06:52:30

+0

我認爲你的意思是'Integer.toString(int)'而不是使用'Integer.parseInt(String)' – 2012-08-06 07:39:03

4

對於大量的數據,System.out.println可能效率不高,因爲它不會讓 做很好的緩衝。在這種情況下,您可以使用BufferedOutputStreamBufferedWriter

0

寫入System.out的最慢部分是顯示正在寫入內容的時間。即對於你寫的每一行,計算機都必須使用字體將信息轉換爲像素並滾動整行。這比你顯示文本的可能性要多得多。

可以加快由

  • 少寫(通常是最好的主意)
  • 寫,而不是一個文件寫入到控制檯(可以是5到10倍快)
+0

或者寫入一個空設備(例如/ dev/null),它會切斷存儲層。 – 2017-05-25 18:55:58

相關問題