【问题标题】:Throughput of arrays of different sizes vary不同大小的数组的吞吐量不同
【发布时间】:2013-01-31 20:46:26
【问题描述】:

我有像

这样的数组
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。我的硬件配置会对此负责吗?如果不是,可能的原因是什么?

【问题讨论】:

  • 我在等待真正的专家来回答这个问题,但原因是 I/O 通常是分块执行的。例如,您的 10kb 数组适合一个 512kb 块,这意味着写入 512kb 数组所需的时间一样多,这意味着每单位存储的速度较低。
  • 你是如何计算吞吐量的?
  • 我将吞吐量计算为块/时间;其中块=(1 * 10)/ 1024; 10 KB。对于 1 MB,块 = 1;

标签: java arrays performance file-io throughput


【解决方案1】:

差异很大的原因在于 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 个字节,因此您的计算可能不正确。

【讨论】:

    猜你喜欢
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多