繁体   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