4

我有像这样的数组

byte[] b = new byte[10];
byte[] b1 = new byte[1024*1024];

我用一些值填充它们。说,

for(i=0;i<10;i++){
     b[i]=1;
}
for(i=0;i<1024*1024;i++){
     b1[i]=1;
}

然后我将它写入一个 RandomAccessFile 并再次从该文件读取到同一个数组中,使用,

randomAccessFile.write(arrayName);
              and
randomAccessFile.read(arrayName);

当我尝试计算这两个不同大小(10 字节和 1Mb)的数组的吞吐量(使用为文件读取和写入计算的时间)时,1MB 数组的吞吐量似乎更高。

Sample Output:
Throughput of 10kb array: 0.1 Mb/sec.
Throughput of 1Mb array: 1000.0 Mb/sec.

为什么会这样?我有四核处理器的 Intel i7。我的硬件配置会对此负责吗?如果不是,可能的原因是什么?

4

1 回答 1

3

造成巨大差异的原因是 I/O 所涉及的开销,无论传输的数据大小如何 - 这就像乘坐出租车的旗帜一样。不限于 java 并且包括许多 O/S 操作的开销包括:

  • 查找磁盘上的文件
  • 检查文件的操作系统权限
  • 为 I/O 打开文件
  • 关闭文件
  • 更新文件系统中的文件信息
  • 许多其他任务

此外,磁盘 I/O 以页为单位执行(大小取决于 O/S,但通常为 2K),因此 1 字节的 I/O 可能与 2048 字节的 I/O 成本相同:更公平的比较是 2048带有 1Mb 数组的字节数组。

如果您使用缓冲 I/O,则可以进一步加快更大的 I/O 任务。


最后,您报告的“10Kb”实际上只是 10 个字节,因此您的计算可能不正确。

于 2013-01-31T21:04:06.487 回答