2011-09-05 52 views
9

使用Java傳輸(不管UP/DOWN)大型文件(3-4演出)時使用的敏感緩衝區大小是多少?使用Java下載文件時的顯式緩衝區大小

byte buf[] = new byte[1024] 

byte buf[] = new byte[5 * 1024 * 1024] 

有時即使你使用一個大的緩衝區,並傳遞給讀(字節數組[])方法並不能保證你,你會得到一個完整的5我緩衝。在我的測試中,我觀察到每個read()調用的平均大小通常爲1.5kb。這是否明智的表現?如果有人能夠指點我一個資源來更詳細地討論這個問題,我會很高興。

回答

10

這聽起來像你從網絡連接讀取(TCP?)

1500字節是默認的以太網MTU,這也解釋了爲什麼你通常得到每讀1.5KB。通過將網絡堆棧配置爲使用jumbo frames,MTU通常可以增加到9KB。

考慮到這一點,使buf大於9KB幾乎肯定沒有意義。使用較小的緩衝區(比如說超過1KB)可能會或可能不會對性能產生負面影響。

在任何情況下,獲得明確答案的唯一方法是通過對各種緩衝區大小進行基準測試。

+0

Hmz,好點。我沒有真正考慮過TCP堆棧的MTU。 – LordDoskias

+1

使用較大的緩衝區將減少Java代碼和本機代碼之間的開關數量,並且可能會對性能產生影響,而與網絡數據包大小無關。 – jarnbjo

+0

由於我的經驗顯示8-100KB緩衝區足夠好。 – umbr

1

在我的研究&測試中,從具有Java 6的Linux上的套接字讀取時,8K是最佳緩衝區大小。如果分配的緩衝區大於8K,則會浪費空間。我讀過Java本地調用使用8K緩衝區,這就是爲什麼8K是最佳的,但我失去了我的參考。有一個指向這個事實的錯誤,但它不是確鑿的證據:http://bugs.sun.com/view_bug.do?bug_id=6444633

這就是說,嘗試在你感興趣的平臺上進行試驗,你會發現最佳的緩衝區大小。如果你懶,8K是一個很好的默認。