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

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

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

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

谢谢

您可以查看我在java中编写的磁盘实用程序。 它可能不是超级幻想,但它的工作原理。

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

以下是写测量代码的片段:

try (RandomAccessFile rAccFile = new RandomAccessFile(testFile,mode)) { for (int b=0; b 

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

jDiskMark截图

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

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

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

你有没有想过使用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(); } } }