微基准输出高波动

时间:2012-02-16 18:08:33

标签: java benchmarking

我正在尝试确定将二进制文件从一个位置保存到另一个位置所需的速度或速度。

    FileInputStream fis = new FileInputStream("/path/to/binary/file");
    BufferedInputStream in = new BufferedInputStream(fis);

    FileOutputStream fos = new FileOutputStream("/path/to/save/new/binary/file");
    BufferedOutputStream out = new BufferedOutputStream(fos);

    long before = System.currentTimeMillis();
    int data = 0;

    while ((data = in.read()) != -1) {
        out.write(data);
    }

    in.close();
    out.close();

    int seconds = (int) (System.currentTimeMillis() - before / 1000) % 60;

    System.out.println("Took " + seconds);

缓冲或无缓冲,输出范围为3到64 ms。我本来期望更近的范围,例如40-50或10-20,或30-40。造成这种高波动的原因是什么?

2 个答案:

答案 0 :(得分:2)

通过仅运行一次测试,您无法期望结果的一致性,尤其是涉及系统调用和文件I / O时。

采取以下步骤,提高测量的意义。

答案 1 :(得分:0)

文件I / O可能涉及很多“随机性”:

  • 这是系统调用,因此您基本上等待IO调度​​程序决定处理您的请求
  • 它可能位于硬盘上,需要时间才能阅读
  • 它可以缓存在内存中,这很快(呃)
  • 其他一些进程可能正在进行繁重的I / O
  • 其他一些进程可能会垄断CPU

查看 cheeken 关于如何处理此问题的建议。