Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中测量磁盘速度以进行基准测试_Java_Io_Benchmarking - Fatal编程技术网

如何在Java中测量磁盘速度以进行基准测试

如何在Java中测量磁盘速度以进行基准测试,java,io,benchmarking,Java,Io,Benchmarking,我想知道如何使用JavaAPI测量磁盘速度 随机读取、顺序读取以及随机和顺序写入 如果有人认为这不是一个真正的问题。请在结束之前解释一下 谢谢我会在磁盘中创建一个大文件,以确保您始终保留相同的空间,然后继续进行测试,即读取/写入文件块,改变这些块的大小。我还将改变块的位置(随机地或在文件的开头和结尾来回移动)。所有这些都可以让您根据数据块的大小等测量特定情况下的平均传输速率 但是,请考虑到,无论您使用java还是简单C,您都无法访问低级文件组织。您可能使用的是碎片化的HD(越空,碎片化的可能性就

我想知道如何使用JavaAPI测量磁盘速度

随机读取、顺序读取以及随机和顺序写入

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


谢谢

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

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


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

您考虑过使用吗

从网站:

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

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

最简单的完整卡尺基准如下所示:

公共类MyBenchmark扩展了SimpleBenchmark{
公共无效时间MyOperation(int reps){
对于(int i=0;i
您可以看看我用java编写的磁盘实用程序。它可能不是超级花哨,但它很管用

以下是编写度量代码的一段代码:

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)");
try(RandomAccessFile rAccFile=新的RandomAccessFile(testFile,模式)){

对于(int b=0;在计时的同时写入一堆东西?是的,一定要注意磁盘读缓存,向磁盘写入文件也会将其添加到磁盘的读缓存中。至少在我的情况下是这样的。
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)");