不同大小的阵列的吞吐量各不相同

时间:2013-01-31 20:46:26

标签: java arrays performance file-io throughput

我有像

这样的数组
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采用四核处理器。我的硬件配置会对此负责吗?如果不是可能的原因?

1 个答案:

答案 0 :(得分:3)

产生巨大差异的原因是无论转移的数据大小如何,I / O所涉及的开销都会出现 - 就像乘坐出租车的旗帜一样。开销不限于java并包含许多操作系统操作,包括:

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

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

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


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