首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >套接字: BufferedOutputStream还是OutputStream?

套接字: BufferedOutputStream还是OutputStream?
EN

Stack Overflow用户
提问于 2012-07-07 07:46:47
回答 1查看 10.1K关注 0票数 10

为了在Java中通过TCP获得最快的传输速度,最好是:

备选案文A:

代码语言:javascript
复制
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();

备选方案B:

代码语言:javascript
复制
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:

代码语言:javascript
复制
socket.setReceiveBufferSize(65536);
socket.setSendBufferSize(65536);

我试着在一台测试机器上将它设置为128 KiB,因为我读到它可以提高速度,但是当服务器有几个连接时,CPU是100%,而不是2%,就像我离开它的时候一样。我想128 KiB太高了,除非您有一个好的服务器可以处理大量的流量,但是将其设置为32 KiB是否明智呢?我认为对我来说,默认情况是8 KiB。

("socket“是"java.net.Socket")

EN

回答 1

Stack Overflow用户

发布于 2012-07-08 08:00:00

我不知道你在哪里读到的那些废话,但它完全回到了前面。您一次写入TCP连接的次数越多,您每次从它读取的内容就越多。我总是在应用程序和套接字流之间使用缓冲流、读取器或写入器。有些情况下,比如SSL,一次直接写一个字节会导致40倍的数据爆炸。

触摸TCP窗口大小是个好主意吗?例如,将其设置为64 KiB

您不能“触摸TCP窗口大小”。您可以通过您提到的API来增加它的最大值,这确实是一个好主意。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11373259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档