gpt4 book ai didi

java - 使用缓冲流发送对象?

转载 作者:行者123 更新时间:2023-12-02 20:11:54 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

Does it make sense (more speed) to use BufferedOutputStream and BufferedInputStream in this case?

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

对象流实现在内部包装了一个名为 BlockDataOutputStream 的私有(private)类给定的流。做缓冲。如果您自己包装流,您将有两级缓冲...这可能会使性能变差2

And when I have to flush or should I not write a flush() statement?

是的,冲洗可能是必要的。但对于何时采取行动并没有统一的答案。

  • 一方面,如果刷新过于频繁,则会产生额外的网络流量。

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

您需要找到这两种综合症之间的折衷方案......这取决于您的应用程序的客户端/服务器交互模式;例如消息模式是同步(例如消息/响应)还是异步(例如消息流)。

<小时/>

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

2 - 可能只是稍微差一点,但是设计良好的基准测试会发现很小的性能差异。

<小时/>

更新

写完上面的内容后,我发现了这个问答 - Performance issue using Javas Object streams with Sockets - 这似乎表明使用 BufferedInputStream/BufferedOutputStream 有帮助。但是,我不确定所报告的性能改进是否是 1)真实的(即不是热身产物)和 2)由于缓冲而导致的。这可能只是由于添加了 flush() 调用。 (原因:因为刷新可能会导致网络堆栈更快地推送数据。)

关于java - 使用缓冲流发送对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26320156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com