4

我想知道如何使用 Java API 测量磁盘速度。

随机读取、顺序读取和随机顺序写入。

如果有人认为这不是一个真正的问题。请在关闭之前解释一下。

谢谢

4

3 回答 3

8

你可以看看我用java写的一个磁盘工具。它可能不是超级花哨,但它确实有效。

https://sourceforge.net/projects/jdiskmark/

这是编写测量代码的片段:

try (RandomAccessFile rAccFile = new RandomAccessFile(testFile,mode)) {
    for (int b=0; b<numOfBlocks; b++) {
        if (App.randomEnable) {
            int rLoc = Util.randInt(0, numOfBlocks-1);
            rAccFile.seek(rLoc*blockSize);
        } else {
            rAccFile.seek(b*blockSize);
        }
        rAccFile.write(blockArr, 0, blockSize);
        totalBytesWrittenInMark += blockSize;
        wUnitsComplete++;
        unitsComplete = rUnitsComplete + wUnitsComplete;
        percentComplete = (float)unitsComplete/(float)unitsTotal * 100f;
    }
}
long endTime = System.nanoTime();
long elapsedTimeNs = endTime - startTime;
double sec = (double)elapsedTimeNs / (double)1000000000;
double mbWritten = (double)totalBytesWrittenInMark / (double)MEGABYTE;
long bwMbSec = mbWritten / sec;
System.out.println("Write IO is " + bwMbSec + " MB/s"
    + "(MB written " + mbWritten + " in " + sec + " sec)");

代码在 gitlab 上: https ://gitlab.com/jamesmarkchan/jDiskMark/

jDiskMark 截图

于 2016-04-09T22:29:27.363 回答
2

我会在磁盘中创建一个大文件,以确保您始终保留相同的空间,然后继续进行测试,即使用RFA读取/写入文件的块,改变这些块的大小。我还会改变块的位置(随机或在文件的初始化和结尾前后返回)。所有这些都可以让您根据块的大小等测量某些情况下的平均传输速率。

但是请注意,无论您使用 java 还是简单的 C,您都无法访问低级文件组织。您可能正在使用碎片化的 HD(越空,它越不可能非常碎片化)。该信息仅在内核级别(而不是用户级级别)可用。但是,如果您执行大量测试(不是一次读取文件的一部分,而是读取整个文件空间)并且磁盘相当空(以确保磁盘上的块没有很多碎片),你可以从统计上得到相当合理的读/写速度指标。

我忘记的另一个会影响您的测量的重要问题是缓存。第一次从文件中读取块时,您可能不会使用缓存,但第二次则不会。为此,我建议您阅读其他问题的方法。

于 2013-02-06T14:54:35.797 回答
2

您是否考虑过使用Caliper

从网站:

Caliper 是 Google 的开源框架,用于编写、运行和查看 JavaMicrobenchmarks 的结果。

0.5 版本的边缘有点粗糙,但我们已经发现它非常有用,并且 API 将保持大部分稳定。

最简单的完整 Caliper 基准测试如下所示:

public class MyBenchmark extends SimpleBenchmark {
  public void timeMyOperation(int reps) {
    for (int i = 0; i < reps; i++) {
      MyClass.myOperation();
    }
  }
}
于 2013-02-06T15:06:26.727 回答