flush()OutputStreamWriter对网络的副作用

时间:2014-05-02 10:06:30

标签: java performance networking flush

刷新传输到网络套接字的OutputStreamWriter有什么副作用。

我有一个程序在每几个字节后调用out.flush()。有什么理由让我等到我需要的所有字节都在缓冲区中?

如果我冲洗太多(更多的开销),我会降低传输速率吗?

这会减慢我的程序执行速度(阻塞)吗?

3 个答案:

答案 0 :(得分:1)

每次写入套接字时,都会添加5到15微秒。对于缓冲输出,当您刷新()数据时会发生这种情况。注意:如果你没有缓冲输出,它将在每次write()时执行,flush()将不会执行任何操作。

幸运的是,操作系统希望应用程序能够进行比最佳调用更多的调用,因此它默认使用Nagle算法将数据部分写入更大的数据包。注意:操作系统不仅可以执行此操作,而且某些网络适配器也会默认执行此操作。

简而言之,不要经常冲洗(),除非数十秒微秒加起来对你很重要,否则你可能不会注意到差异。例如如果你进行100次冲洗,你可能会增加一毫秒。

答案 1 :(得分:1)

没有理由冲洗,除非:

  • 您希望对等方尽快接收数据
  • 您已发送缓冲请求,现在您正在阅读回复。

在其他情况下,最好允许缓冲区,Nagle算法和TCP接收窗口发挥作用。

答案 2 :(得分:0)

如果在网络上进行数据传输,则outputStreamWriter的flush的批处理确实可以提高性能。 我观察到大约520字节的单个数据包刷新大约需要3毫秒。