使用缓冲流来发送对象?

mac*_*ery 2 java sockets iostream bufferedreader

我目前在使用OutputStream的客户端 - 服务器应用程序中使用Java套接字而不是BufferedOutputStream(对于输入流也是如此).

客户端和服务器交换序列化对象(writeObject()方法).

在这种情况下使用BufferedOutputStream和BufferedInputStream是否有意义(更快)?

当我必须刷新或者我不应该写一个flush()语句?

Ste*_*n C 7

在这种情况下使用BufferedOutputStream和BufferedInputStream是否有意义(更快)?

实际上,它可能没有意义1.

对象流实现在内部用一个称为BlockDataOutputStream缓冲的私有类包装它给出的流.如果您自己包装流,您将有两个级别的缓冲...这可能会使性能变差2.

当我必须刷新或者我不应该写一个flush()语句?

是的,可能需要冲洗.但是关于什么时候这样做没有普遍的答案.

  • 一方面,如果您经常刷新,则会产生额外的网络流量.

  • 另一方面,如果在需要时不进行刷新,则服务器可能会停止等待客户端已写入但未刷新的对象.

你需要找到这两个综合症之间的妥协......这取决于你的应用程序的客户端/服务器交互模式; 例如,消息模式是同步的(例如消息/响应)还是异步的(例如消息流).


1 - 为了确定这一点,您需要进行一些取证测试,以1)测量系统性能,2)确定进行了哪些系统调用以及何时发送网络数据包.对于一般答案,您需要对许多用例重复此操作.我还建议您自己查看Java库代码以确认我的(简短)阅读.

2 - 可能只是稍差一点,但设计良好的基准测试会带来很小的性能差异.


UPDATE

写完上面的内容之后,我发现这个Q&A - 使用带有套接字的Javas Object流的性能问题 - 这似乎表明使用BufferedInputStream/ BufferedOutputStream帮助.但是,由于缓冲,我不确定报告的性能改进是1)真实的(即不是热身伪影)和2).这可能只是因为添加了flush()通话.(为什么:因为刷新可能导致网络堆栈更快地推送数据.)