代码之家  ›  专栏  ›  技术社区  ›  Anton

Java-使用带套接字的DataInputStream,是否缓冲?

  •  7
  • Anton  · 技术社区  · 14 年前

    我正在编写一个简单的客户机/服务器应用程序,我发现使用DataInputStream读取数据非常方便,因为它允许您选择要读取的内容(不必自己从字节转换数据),但我想知道是否最好也将其包装在BufferedInputStream中,或者这只是增加不必要的开销?

    接收到的数据通常很小,大约20-25字节。

    2 回复  |  直到 14 年前
        1
  •  7
  •   Stephen C    14 年前

    DataInputStream没有缓冲,因此 DataInputStream 对象将产生一个 读取底层套接字流,这可能导致多个系统调用(或等效的)。

    系统调用通常比常规方法调用贵2到3个数量级。缓冲流通过减少系统调用的数量(理想情况下为1)工作,代价是添加额外的一层常规方法调用。通常使用缓冲流将N个syscall替换为1个syscall和N个额外的方法调用。如果N大于1,则获胜。

    因此,在套接字流和DataInputStream之间放置BufferedInputStream的唯一情况是

    • 当应用程序只生成一个 read...() 一个系统调用就可以满足这个要求,
    • read(byte[] ...) 打电话,或
    • 当应用程序不读取任何内容时。

    此外,即使它们确实适用,在不需要时使用BufferedInputStream的开销也相对较小。在需要时不使用BufferedInputStream的开销可能很大。

    最后一点,实际读取的数据量(即消息的大小)是 缓冲与非缓冲的难题。真正重要的是数据的读取方式,即 阅读…() 应用程序将进行的调用。

        2
  •  2
  •   Cameron Skinner    14 年前

    一般的看法是,底层流上的单个读取非常慢,因此缓冲几乎总是更快。然而,对于如此小的数字(20-25字节),分配缓冲区的成本可能与进行单独读取的成本类似(一旦考虑内存分配和垃圾收集)。不幸的是,唯一能找到答案的方法就是测试它然后看看。

    你说收到的数据是 小:你多久会收到更大的信息?如果在无缓冲流上偶尔接收到大消息,这将是一个重要的瓶颈。

    我建议您运行一些计时测试,看看缓冲对您的情况是否有影响。或者,不用费心计时测试,只需使用缓冲区。如果将来消息大小发生变化,则这将减少以后的维护。