2011-09-28 157 views
2

在windows中可以說我使用recv函數從套接字接收數據。 我很好奇最佳緩衝區有多大?我可以使它成爲1024字節,或者我可以使它成爲51200字節或更大。我想知道哪一個對性能更好。C Windows緩衝區大小

這不僅適用於recv函數,讓我們說讀一個大的文本文件,我想要一個非常大的緩衝區,或一個較小的緩衝區?

回答

3

操作系統執行自己的緩衝,所以緩衝區的大小並不重要。性能損失在函數調用中:1字節的緩衝區效率低,因爲它需要對recv()進行過多的調用。太大的緩衝區只是浪費空間。

最佳大小將是您希望接收或能夠在單個recv()調用中處理的數據大小的兩倍,具有大約1或2個tcp幀的下限。

我個人使用4KB緩衝區,但這是我自己的偏好,它很大程度上取決於我正在編寫的應用程序。

0

操作系統已經對它進行了緩衝,所以你不妨在當時只讀一個字節。

+4

一個上下文切換不給你任何「最佳表現獎」...... –

0

這取決於您期望的數據類型和您期待的協議。 UDP例如會給你一個全包走那麼最佳的緩衝區大小可能是1500

真正的性能障礙將是函數調用(recv在這種情況下),你將使。爲了提高性能,您可以從默認較大的值開始,然後分析正在接收的數據包大小。根據分析,您可以傳遞(幾乎)「理想」的緩衝區大小。

0

如果您有服務器類型的情況,您不知道要在其上運行哪些服務,則可以使用不同大小的緩衝池陣列,例如[128,1024,4096,16384,65536 ]。當有東西連接時,使用128個大小,如果所有128個大小都進來,下次使用1024 ......等等。

在客戶端或服務器已知的協議/加載,只是八九不離十猜測它,(多由其他海報:)

RGDS, 馬丁建議

每字節