Java flush()OutputStreamWriter对网络的副作用
刷新将要连接到网络套接字的OutputStreamWriter有什么副作用 我有一个程序,每隔几个字节调用Java flush()OutputStreamWriter对网络的副作用,java,performance,networking,flush,Java,Performance,Networking,Flush,刷新将要连接到网络套接字的OutputStreamWriter有什么副作用 我有一个程序,每隔几个字节调用out.flush()。是否有任何理由让我等待,直到我需要的所有字节都在缓冲区中 如果我花费太多(更多的开销),我会得到更低的转移率吗 这会降低我的程序的执行速度吗(阻塞)?每次写入套接字时,您都会增加5到15微秒。对于缓冲输出,这在刷新()数据时发生。注意:如果您没有缓冲输出,它将在每个write()上执行,而flush()不会执行任何操作 幸运的是,操作系统期望应用程序发出的调用多于最佳
out.flush()
。是否有任何理由让我等待,直到我需要的所有字节都在缓冲区中
如果我花费太多(更多的开销),我会得到更低的转移率吗
这会降低我的程序的执行速度吗(阻塞)?每次写入套接字时,您都会增加5到15微秒。对于缓冲输出,这在刷新()数据时发生。注意:如果您没有缓冲输出,它将在每个write()上执行,而flush()不会执行任何操作 幸运的是,操作系统期望应用程序发出的调用多于最佳调用,因此它默认使用Nagle算法将写入的部分数据分组到更大的数据包中。注意:不仅操作系统可以做到这一点,而且一些网络适配器在默认情况下也可以做到这一点
简言之,不要太频繁地刷新(),但除非数十微秒加起来对您来说很重要,否则您可能不会注意到差异。e、 g.如果刷新100次,可能会增加毫秒。没有理由刷新,除非:
- 您希望对等方尽快接收数据
- 您已经发送了一个缓冲请求,现在要读取响应
在其他情况下,最好允许缓冲区、Nagle算法和TCP接收窗口发挥其魔力。在网络上进行数据传输的情况下,outputStreamWriter刷新的批处理确实会提高性能。
我观察到,单次刷新大约520字节的数据包大约需要3毫秒。所以刷新不会迫使Nagle的算法被忽略?很高兴知道这一点。@JonSkeet socket.setTcpNoDelay(true)应该关闭Nagle,但操作系统和网络适配器使用的算法是自适应的,您通常看不到任何差异。@JonSkeet当然没有。flush()将应用程序缓冲区刷新到TCP缓冲区。之后发生的事情是完全独立的。@EJP:我不会说这很明显,足以证明“当然不是”——一般来说,如果我在某些事情上显式调用
flush()
,我希望flush会得到尽可能多的关注。例如,一个文件系统可能有写缓冲和JVM,但我希望FileOutputStream
上的刷新也会尝试刷新文件系统缓冲。@EJP:谢谢提醒。老实说,这感觉不太理想:(