2013-02-06 35 views
4

我想知道如何使用Java API来测量磁盘速度。如何用Java测量磁盘速度以进行基准测试

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

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

感谢

+0

读取和写入,同时一堆东西时机呢? –

回答

2

我会在磁盘创建一个大的文件,以确保您始终保留同样的空间,然后用测试,即与RFA文件的读/写块进行,不同的块的大小。我也会改变块的位置(随机地或者返回文件的init和end)。所有这些都可以让你测量某些情况下的平均传输速率,具体取决于块的大小等。

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

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

+0

是的,一定要注意磁盘读取缓存,写入文件到磁盘也将它添加到磁盘的读取缓存。至少在我的情况下,它的确如此。 – simgineer

1

您是否想过使用Caliper

从网站:

显卡是谷歌的写作开源框架,运行和查看JavaMicrobenchmarks的结果。

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

最简单的完整的显卡基准测试是这样的:

public class MyBenchmark extends SimpleBenchmark { 
    public void timeMyOperation(int reps) { 
    for (int i = 0; i < reps; i++) { 
     MyClass.myOperation(); 
    } 
    } 
} 
7

你可以看看磁盘实用程序我在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