【发布时间】:2016-01-27 04:03:09
【问题描述】:
这是给tomcat/网络专家的一篇。我会对其进行基准测试/wireshark,但这要求很高,也许有人知道答案。
比较这两种生成 servlet 输出的方法,从用户的角度来看,哪一种是最快的:
-
直接写入 servlet 输出流:
for(int i=0;i
-
创建缓冲区并一次性写入
for(int i=0;i
我可以想象方法 1 的优点是响应可以快速开始发送内容,而在方法 2 中发送稍后开始。
另一方面,方法 1 可以生成更多/更小的 TCP 数据包,而这些数据包又可能需要更长的时间才能完全传输?
问候
PS:请不要告诉我这是过早的优化。在手头的情况下,我有一个提供toString 和write(Appendable a) 方法的对象。我只需要在这里选择使用哪一个。此外,从理论的角度和关于 servlet 的一般设计,我发现这非常有趣。
编辑:感谢大家的回答。但似乎我的问题不清楚或过于简单化了我的例子。
我根本不担心没有缓冲。我知道在发送队列中必须至少在一个地方进行缓冲。可能它在多个地方(Java、OS、硬件)。我认为我真正的问题是:这些缓冲区何时刷新?
为了更清楚起见,假设我们的 MTU 为 1000,并且发送连续数据包是由硬件的缓冲区空中断触发的。那么在第一种情况下,它可能看起来像:
. packet( "a" ) //triggered by the first write( "a" ),
. packet( "aaaaaaa" ) // triggered by buffer-empty, sending the amount of "a"s which have been written in the meantime
. packet( "aaaa" ) // and so on
. packet( "aaaaaaaaaaa" )
...x1000 // or so in this example
而对于第二种情况,发送开始时已经有 10000 个字节可用,因此结果将是:
. packet( "aaaa....a(x1000)" )
. packet( "aaaa....a(x1000)" )
...x10
即使对于较小的数据大小(小于 MTU,比如说 100 个“a”)并且创建输出更快,它也可以发送结果可能看起来像:
. packet( "a" ) // first write
. packet( "aaaa...a(x99) ) // all remaining data available when buffer-empty interrupt.
当然,如果缓冲区的工作方式不同,这一切都会完全不同。例如。如果他们正在等待更多数据发送或等待刷新发送任何东西......(但这反过来也会在某些方面减慢发送速度)
所以这是我不知道的:tomcat 中的这种缓冲究竟是如何工作的,使用它的最佳策略是什么?
(而且我并不担心或期待更大的速度提升。我只是想知道事情是如何运作的。)
【问题讨论】:
标签: java tomcat servlets networking