我有像
这样的数组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采用四核处理器。我的硬件配置会对此负责吗?如果不是可能的原因?
答案 0 :(得分:3)
产生巨大差异的原因是无论转移的数据大小如何,I / O所涉及的开销都会出现 - 就像乘坐出租车的旗帜一样。开销不限于java并包含许多操作系统操作,包括:
此外,磁盘I / O以页面形式执行(大小取决于O / S,但通常为2K),因此1字节的I / O可能与2048字节的I / O成本相同:稍微更公平的比较会是一个带有1Mb阵列的2048字节数组。
如果您使用缓冲I / O,则可以进一步加快更大的I / O任务。
最后,您报告为“10Kb”的事实上只有10个字节,因此您的计算可能不正确。