如何用Java测量基准测试中的磁盘速度

时间:2013-02-06 14:41:39

标签: java io benchmarking

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

随机读取,顺序读取以及随机和顺序写入。

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

由于

3 个答案:

答案 0 :(得分: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 screenshot

答案 1 :(得分:2)

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

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

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

答案 2 :(得分: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();
    }
  }
}