为了在Java中获得最快的TCP传输速度,这是更好的:
选项A:
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
Run Code Online (Sandbox Code Playgroud)
选项B:
BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
Run Code Online (Sandbox Code Playgroud)
我已经读过,当将8 KiB写入OutputStream时,性能会受到影响,建议它一次性写入小块而不是pver 8 KiB.8 KiB是BufferedOutputStream的默认缓冲区大小.
但是我还读到,当通过网络传输数据时,尽可能快地清除字节是很好的.这意味着使用缓冲区并以小块写入会增加不必要的开销.
那么,选项A还是选项B?哪个效果最好?
现在我猜测选项A提供了最高的传输速度,同时消耗了比选项B更多的CPU.选项B可能更好,因为它没有那么慢,但节省了大量的CPU.
-
奖金问题:触摸TCP窗口大小是个好主意吗?例如,将其设置为64 KiB:
socket.setReceiveBufferSize(65536);
socket.setSendBufferSize(65536);
Run Code Online (Sandbox Code Playgroud)
我尝试在测试机器上将其设置为128 KiB,因为我读到它可以提高速度但是当服务器有几个连接时,CPU是100%而不是2%,就像我单独离开时一样.我猜128 KiB太高了,除非你有一台能够处理流量急流的好服务器,但将它设置为32 KiB是否明智?我认为我的默认值是8 KiB.
("socket"是"java.net.Socket")