簡體   English   中英

Java - 使用帶有套接字的DataInputStream,是否緩沖?

[英]Java - Using DataInputStream with Sockets, buffered or not?

我正在編寫一個簡單的客戶端/服務器應用程序,我發現使用DataInputStream讀取數據非常方便,因為它允許您選擇要讀取的內容(無需自己從字節轉換),但我想知道它是否會最好將它包裝在BufferedInputStream中,或者如果這只會增加不必要的開銷?

我問的原因是因為我不知道直接從套接字流中讀取是多么昂貴(當使用BufferedInputStream時,它只會從套接字流中讀取一次,然后使用DataInputStream從BufferedInputStream中乘以時間)。

收到的數據通常很小,大約20-25字節。

提前感謝您的回答! :d

DataInputStream沒有緩沖,因此DataInputStream對象上的每個讀取操作都將導致對底層套接字流進行一次或多次讀取,這可能導致多個系統調用(或等效的)。

系統調用通常比常規方法調用貴2到3個數量級。 緩沖流通過減少系統調用的數量(理想情況下為1)來工作,但代價是添加額外的常規方法調用層。 通常使用緩沖流用1個系統調用和N個額外方法調用替換N個系統調用。 如果N大於1,你就贏了。

因此,在套接字流和DataInputStream之間放置BufferedInputStream的唯一情況不是 win:

  • 當應用程序只進行一次read...()調用並且可以通過單個系統調用來滿足時,
  • 當應用程序只進行大量的read(byte[] ...)調用時,或者
  • 當應用程序沒有讀取任何內容時。

聽起來這些不適用於您的情況。

此外,即使它們確實適用,當你不需要時使用BufferedInputStream的開銷相對較小。 當你需要時,不使用BufferedInputStream的開銷很大。

最后一點,實際讀取的數據量(即消息的大小)與緩沖與未緩沖的難題幾乎無關 真正重要的是讀取數據的方式; 即應用程序將執行的read...()調用序列。

一般的智慧是對底層流的單獨讀取非常慢,因此緩沖幾乎總是更快。 但是,對於如此小的數字(20-25字節),分配緩沖區的成本可能與進行單獨讀取的成本相似(一旦考慮內存分配和垃圾收集)。 不幸的是,找出答案的唯一方法是測試並查看。

您說收到的數據通常很小:您預計更頻繁的郵件頻率是多少? 如果您在無緩沖的流上偶爾收到大量消息,那將是一個重大的瓶頸。

我建議你運行一些計時測試,看看緩沖是否會對你的情況產生影響。 或者,不要打擾時間測試,只需使用緩沖區。 如果將來郵件大小發生變化,那么這將在以后減少維護。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM