Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java flush()OutputStreamWriter对网络的副作用_Java_Performance_Networking_Flush - Fatal编程技术网

Java flush()OutputStreamWriter对网络的副作用

Java flush()OutputStreamWriter对网络的副作用,java,performance,networking,flush,Java,Performance,Networking,Flush,刷新将要连接到网络套接字的OutputStreamWriter有什么副作用 我有一个程序,每隔几个字节调用out.flush()。是否有任何理由让我等待,直到我需要的所有字节都在缓冲区中 如果我花费太多(更多的开销),我会得到更低的转移率吗 这会降低我的程序的执行速度吗(阻塞)?每次写入套接字时,您都会增加5到15微秒。对于缓冲输出,这在刷新()数据时发生。注意:如果您没有缓冲输出,它将在每个write()上执行,而flush()不会执行任何操作 幸运的是,操作系统期望应用程序发出的调用多于最佳

刷新将要连接到网络套接字的OutputStreamWriter有什么副作用

我有一个程序,每隔几个字节调用
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:谢谢提醒。老实说,这感觉不太理想:(