1

我想知道这两个尝试通过 TCP 套接字发送大文件的块在性能方面的差异。我找不到太多资源来解释它们的效率。

一种-

byte[] buffer = new byte[1024];
int number;

while ((number = fileInputStream.read(buffer)) != -1) {
socketOutputStream.write(buffer, 0, number);
}

乙-

byte mybytearray = new byte[filesize];
os.write(mybytearray);

在传输延迟方面哪个更好?

另外,如果我将大小设置为 1024 或 65536,有什么区别?那会如何影响性能。

4

2 回答 2

4

直到文件的最后一个字节到达的延迟基本相同。然而,第一个更可取,尽管缓冲区更大,原因如下:

  1. 数据开始更快到达。
  2. 没有假设文件大小适合int.
  3. 没有假设整个文件适合内存,所以
  4. 它无需更改代码即可扩展到非常大的文件。
于 2012-07-09T08:54:04.890 回答
1

您的MTU(最大传输单元)大小可能在 1500 字节左右。这意味着无论您做什么,您的数据都将被分解(或组合成)这个大小。512 字节以上的任何合理缓冲区大小都可能为您提供相同的传输速度。

您发送和接收数据的方式会影响您使用的 CPU 数量。除非您有一个快速的网络,例如 10 GB,否则您的 CPU 将无法跟上您的网络。

以有效的方式编写代码将确保您不会浪费 CPU(这是一件好事),但不会对受带宽(和网络延迟)限制的传输速度产生太大影响

于 2012-07-09T09:08:11.317 回答