2017-03-08 45 views
1

我預計,由於PrintStream的緩衝,由每個打印()後,添加刷新操作,速度表現應該顯著下降,但它並沒有在所有如下面的代碼片段所示。PrintStream的緩衝,但沖水不會降低性能和的BufferedOutputStream加速性能

此外,纏繞一個的BufferedOutputStream一個PrintStream的10倍以上,提高了性能 - 這意味着爲PrintStream不會被緩衝。

是爲PrintStream真的不緩衝,或者它有一個非常小的緩衝區,或者是有爲什麼它不提供從一個緩衝流預期的速度提高一些其他的解釋嗎?

 // PrintStream is buffered but takes 4228ms to complete 
    long start = System.currentTimeMillis(); 
    try (PrintStream ps = new PrintStream(new FileOutputStream("1.txt"))) 
    { 
     for (int i = 0; i < 1_000_000; i++) { 
      ps.print(i + " "); 
     } 
    } 
    long stop = System.currentTimeMillis(); 
    System.out.println(stop - start); 

    // PrintStream is buffered, but with auto-flush takes 4140ms to complete, no degraded speed implying flush did nothing 
    start = System.currentTimeMillis(); 
    try (PrintStream os = new PrintStream(new FileOutputStream("1.txt"))) 
    { 
     for (int i = 0; i < 1_000_000; i++) { 
      os.print(i + " "); 
      os.flush(); 
     } 
    } 
    stop = System.currentTimeMillis(); 
    System.out.println(stop - start); 
    // PrintStream is buffered explicitly as a BufferedOutputStream and runs quickly: 202ms 
    start = System.currentTimeMillis(); 
    try (PrintStream os = new PrintStream(new BufferedOutputStream(new FileOutputStream("1.txt")))) 
    { 
     for (int i = 0; i < 1_000_000; i++) { 
      os.print(i + " "); 
     } 
    } 
    stop = System.currentTimeMillis(); 
    System.out.println(stop - start); 
+0

@jtahlborn在源代碼中陳述我的_assumes_ PrintStream的問題_is_緩衝......我的問題是,爲什麼它像一個的BufferedOutputStream確實不imporve性能。 – Jonathan

+0

猜我誤解了,我以爲你問是否緩衝。 – jtahlborn

回答

2

雖然內部構件「緩衝」,寫入方法刷新內部緩衝器對每write()基礎流。因此,在前兩個示例中,每個write()最終都會觸及FileOutputStream。在第三個場景中,你得到實際緩衝,其中寫操作僅定期擊中FileOutputStream中。

如果您使用自己的基礎流而不是FileOutputStream,則會看到前兩種情況會導致對您的流的大約1,000,000次寫入調用,而最後一種情況將導致調用次數少得多(基於緩衝區大小)。

+0

非常有趣......因此,如果PrintStream始終刷新,它有什麼意義呢? – Jonathan

+0

@喬納森沒有任何意義。內部的「緩衝區」實際上就是在那裏處理char到字節轉換。說實話,PrintStream的是它是由一些較新的流實現的做得比較好的一個真正的「傳統」類,你會不會在實踐中真正使用System.out'的'外面等應有盡有。 – jtahlborn