Java 中 write(int b) 和 write(byte b[]) 之间的性能差距

问题描述 投票:0回答:1

我发现,当我使用

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 次并比较两种方法的差异,结果是性能差距似乎没有那么大。

java linux tcp system-calls serversocket
1个回答
0
投票

这完全有道理。 假设您需要向套接字写入 1000 个字节。

byte[] b = new byte[1000];

b 上执行 for 循环并逐一写入流将使您在“JVM”内循环,从而“遭受”JVM 性能的影响。

但是,直接调用 write (b) 方法将触发底层本机 socketWrite0,它将使用本机方式将缓冲区直接写入套接字文件描述符,这显然不在 JVM 中,并且本机速度更快。

© www.soinside.com 2019 - 2024. All rights reserved.