我发现,当我使用
Socket socket = new Socket(); OutputStream outputStream = socket.getOutputStream();
并调用write方法时,有两种选择:write(int b)和write(byte b[]),我编写代码来测试它们的性能。我发现 write(byte b[]) 比 write(int b) 更快。
我阅读了源代码,猜测差异可能是由应用缓冲区和释放缓冲区的成本引起的。
但我不确定我找到了正确的答案,因为这可能是因为系统调用和TCP/IP的机制。
我尝试编码来测试和阅读源代码,我想这可能是因为使用了
char BUF[MAX_BUFFER_LEN];
。我尝试在每次调用 write(bytes[] b) 时在 java 中应用 space b.length 次并比较两种方法的差异,结果是性能差距似乎没有那么大。
这完全有道理。 假设您需要向套接字写入 1000 个字节。
byte[] b = new byte[1000];
在 b 上执行 for 循环并逐一写入流将使您在“JVM”内循环,从而“遭受”JVM 性能的影响。
但是,直接调用 write (b) 方法将触发底层本机 socketWrite0,它将使用本机方式将缓冲区直接写入套接字文件描述符,这显然不在 JVM 中,并且本机速度更快。