2013-03-13 127 views
0

當讀取本地文件並通過網絡(本地和Internet)發送它時,是否有任何建議或建議的緩衝區大小?我們使用4k,因爲它是Windows VM的頁面大小,但由於這可能是延遲,帶寬,抖動等複雜的功能,因此我想了解在大多數情況下可以很好地實現的實現。我們寧願採用更簡單的解決方案來儘量減少代碼更改(代碼審計)。通過LAN/Internet傳輸文件時上傳緩衝區大小?

using (var destFs = new NetworkStream(URI, FileMode.OpenOrCreate)) 
{ 
    var buffer = new byte[4*1024]; // <= better buffer size? 
    int bytesRead; 
    while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     destFs.Write(buffer, 0, bytesRead); 
    } 
} 
+0

4096通常是我所看到的,但我無法用科學來證明它。 – Romoku 2013-03-13 00:57:25

+0

在我的職業生涯中,我體驗到最好的價值是8192,但我不知道。但似乎更快。 – sborfedor 2016-01-20 13:59:36

回答

0

這要看!

如果您使用的是TCP(您可以在這裏intrested)

的TCP數據包大小的絕對限制是64K(65535個字節),但在實用性,這是遠遠超過任何尺寸數據包你會看到,因爲較低層(例如以太網)具有較低的數據包大小。

以太網的MTU(最大傳輸單位)爲1500字節。某些類型的網絡(如令牌環)具有較大的MTU,並且某些類型具有較小的MTU,但這些值是針對每種物理技術固定的。

如果使用UDP

正確的最大UDP消息大小是65507,如由下式確定:0xFFFF的 - (的sizeof(IP報頭)+的sizeof(UDP報頭))= 65535 - (20 + 8)= 65507

+0

最大的TCP數據包大小,MTU等,都與應用程序緩衝區的大小無關,因爲TCP會進行分組。 – EJP 2013-03-13 04:29:34

0

您應該使其成爲2的冪,並且由於您給出的原因,您還應該使其成爲4096的倍數,並且它應該是常見的磁盤簇大小。我個人在任何地方都使用8192,但是如果你對吞吐量感興趣,你可能會發現使用像32k,128k等的大小更好:實驗會顯示好處開始變得邊際的地方。

+1

@downvoter請解釋你的問題與這個答案。無法解釋的downvotes往往被視爲純粹的網站破壞行爲。 – EJP 2013-03-13 06:54:17

+1

奇怪的downvoter,因爲答案很有道理,雖然它不是'堅如磐石'。考慮到底層網絡變量的數量,一行C#語句很難「堅如磐石」。無論如何,我投了票... – DeepSpace101 2013-03-13 21:41:36

+0

我同意8192.在我的測試是最好的價值。 – sborfedor 2016-01-20 14:00:26