为了在Java中通过TCP获得最快的传输速度,最好是:
备选案文A:
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();备选方案B:
BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());我已经看到,当将8 KiB写到OutputStream上时,性能会受到影响,建议将它写成小块,而不是一次写8 KiB。8 KiB是BufferedOutputStream的默认缓冲区大小。
然而,我也读过,当在网络上传输数据时,最好尽快清除出字节。这意味着使用缓冲区并用小块写入会增加不必要的开销。
所以,选择A还是选择B?哪一种效果最好?
现在,我猜选项A给出了最高的传输速度,同时消耗了比选项B更多的CPU。选项B可能更好,因为它不会太慢,但是节省了大量的CPU。
--
附加问题:触摸TCP窗口大小是个好主意吗?例如,将其设置为64 KiB:
socket.setReceiveBufferSize(65536);
socket.setSendBufferSize(65536);我试着在一台测试机器上将它设置为128 KiB,因为我读到它可以提高速度,但是当服务器有几个连接时,CPU是100%,而不是2%,就像我离开它的时候一样。我想128 KiB太高了,除非您有一个好的服务器可以处理大量的流量,但是将其设置为32 KiB是否明智呢?我认为对我来说,默认情况是8 KiB。
("socket“是"java.net.Socket")
发布于 2012-07-08 08:00:00
我不知道你在哪里读到的那些废话,但它完全回到了前面。您一次写入TCP连接的次数越多,您每次从它读取的内容就越多。我总是在应用程序和套接字流之间使用缓冲流、读取器或写入器。有些情况下,比如SSL,一次直接写一个字节会导致40倍的数据爆炸。
触摸TCP窗口大小是个好主意吗?例如,将其设置为64 KiB
您不能“触摸TCP窗口大小”。您可以通过您提到的API来增加它的最大值,这确实是一个好主意。
https://stackoverflow.com/questions/11373259
复制相似问题