2011-04-12 42 views
6

我有一個理論問題。假設你有一個InputStream和一個OutputStream。你需要將內容從一個拷貝到另一個,並且你不知道需要傳送的內容的大小。 write方法中塊大小的一般選擇是什麼?java流中的最佳塊大小

+1

這被稱爲「過早優化」。使用諸如Apache Commons IO之類的庫,然後如果出現性能問題,請調整塊大小。最佳值取決於連接到輸入和輸出流(磁盤文件,管道,網絡連接等)的內容。 – 2011-04-12 03:48:19

+3

我通常使用4096作爲文件訪問的塊大小。在很多情況下它是有效的。雖然4096是非常小的塊,但與磁盤訪問成本相比,方法調用成本是可以忽略的。 – 2011-04-12 03:56:31

回答

3

爲的BufferedInputStream和的BufferedOutputStream默認的緩衝區大小爲8KB,這通常是一個很好的規模。

注意:如果您正在讀取足夠快的套接字,您很少會獲得更多的一個數據包,大約1.5 KB。如果您正在從磁盤讀取數據,通常會得到您要求的任何大小,但性能在32 KB到256 KB之間無法提高,並且很可能取決於您使用的硬件。

但是我也發現,除非是基準測試,否則如果僅使用512個字節作爲緩衝區大小(哪種Inflator/Deflator流會執行),即差別可能小於或等於15%,您很少會看到明顯差異。

總之,您不大可能注意到512字節和32 KB之間的緩衝區大小不同。後者在大多數情況下可能綽綽有餘。我傾向於使用256 KB,因爲我有很多內存和很少的預分配緩衝區。