2010-11-05 43 views
6

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

我問的原因是因爲我不知道直接從套接字流中讀取代碼有多昂貴(當使用BufferedInputStream時,它只會從套接字流讀取一次,然後使用BufferedInputStream DataInputStream類)。

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

在此先感謝您的任何答案! :d

回答

6

一個DataInputStream不進行緩衝,所以每一個DataInputStream物體上的讀操作是要導致一個或多個上底層套接字流中讀取,這可能導致多個系統調用(或等同物) 。

系統調用通常比常規方法調用貴2至3個數量級。緩衝流通過減少系統調用的數量(理想情況下爲1)來工作,但需要增加一層額外的常規方法調用。通常使用緩衝流將1個系統調用和N個額外方法調用替換爲N個系統調用。如果N大於1,那麼你贏了。

由此可見,只有情況下,把流套接字之間的BufferedInputStream和DataInputStream類是雙贏是:

  • 當應用程序只會讓一個人read...()呼叫,並可以由滿足單系統調用,
  • 當應用程序只有很大的read(byte[] ...)調用,或
  • 當應用程序不讀取任何東西。

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

此外,即使它們適用,當您不需要時使用BufferedInputStream的開銷也相對較小。在需要時不使用BufferedInputStream的開銷可能會很大。

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

2

一般的看法是,基礎流上的個體讀取非常緩慢,因此緩衝幾乎總是更快。但是,對於如此小的數字(20-25字節),分配緩衝區的成本可能與製作這些單獨讀取的成本(一旦考慮內存分配和垃圾收集)相似。不幸的是,找出答案的唯一方法是測試它並查看。

你說收到的數據是通常是小:你預計多長時間一次?如果您在未緩衝的流上收到偶爾的大消息,那將是一個重大瓶頸。

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

+0

這沒有意義。緩衝區在套接字的生命週期中被分配一次。可以有任意數量的讀取。讀取越緩慢,讀取越緩慢。 – EJP 2010-11-05 23:16:27

+0

如果客戶端正在連接,發送一條小消息,然後斷開(如Ajax-y可能),則緩衝可能效率低下。閱讀數量必須非常小,但20-25的範圍可能足夠低。我不知道:這就是爲什麼我建議分析。 – 2010-11-05 23:20:10

+0

現在我想到了,AJAX不會給你20-25字節的消息...... XML太冗長了。不過,我*認爲客戶不會保持聯繫。如果這個假設是錯誤的,那麼總是使用緩衝區。 – 2010-11-05 23:22:20

相關問題