mac*_*ery 2 java sockets iostream bufferedreader
我目前在使用OutputStream的客户端 - 服务器应用程序中使用Java套接字而不是BufferedOutputStream(对于输入流也是如此).
客户端和服务器交换序列化对象(writeObject()方法).
在这种情况下使用BufferedOutputStream和BufferedInputStream是否有意义(更快)?
当我必须刷新或者我不应该写一个flush()语句?
在这种情况下使用BufferedOutputStream和BufferedInputStream是否有意义(更快)?
实际上,它可能没有意义1.
对象流实现在内部用一个称为BlockDataOutputStream缓冲的私有类包装它给出的流.如果您自己包装流,您将有两个级别的缓冲...这可能会使性能变差2.
当我必须刷新或者我不应该写一个flush()语句?
是的,可能需要冲洗.但是关于什么时候这样做没有普遍的答案.
一方面,如果您经常刷新,则会产生额外的网络流量.
另一方面,如果在需要时不进行刷新,则服务器可能会停止等待客户端已写入但未刷新的对象.
你需要找到这两个综合症之间的妥协......这取决于你的应用程序的客户端/服务器交互模式; 例如,消息模式是同步的(例如消息/响应)还是异步的(例如消息流).
1 - 为了确定这一点,您需要进行一些取证测试,以1)测量系统性能,2)确定进行了哪些系统调用以及何时发送网络数据包.对于一般答案,您需要对许多用例重复此操作.我还建议您自己查看Java库代码以确认我的(简短)阅读.
2 - 可能只是稍差一点,但设计良好的基准测试会带来很小的性能差异.
UPDATE
写完上面的内容之后,我发现这个Q&A - 使用带有套接字的Javas Object流的性能问题 - 这似乎表明使用BufferedInputStream/ BufferedOutputStream帮助.但是,由于缓冲,我不确定报告的性能改进是1)真实的(即不是热身伪影)和2).这可能只是因为添加了flush()通话.(为什么:因为刷新可能导致网络堆栈更快地推送数据.)