1

我正在尝试对我的硬盘进行基准测试,并找到以 Mb/s 为单位的吞吐量和以毫秒为单位的延迟。这是我的代码。

public class OneMB implements Timer {
public static void main(String a[]) throws IOException {
    OneMB oneMB = new OneMB();
    oneMB.process();

}
public void process() throws IOException{
    RandomAccessFile randomAccessFile=null;
    try{            
        File file=new File("oneMByte.txt");
        byte[] b=new byte[1024];
        randomAccessFile=new RandomAccessFile(file, "rw");
        randomAccessFile.setLength(1024*1024*10);
        long endLatency=0;
        int i=0;
        long startWrite = this.getTimer();
        randomAccessFile.writeBoolean(true);
        endLatency=this.getTimer();                 
        for (i = 0; i < 1024*10*1024-1; i++) {
            randomAccessFile.writeBoolean(true); //Writes a boolean to the file as a one-byte value.
        }
        long endWrite = this.getTimer();
        randomAccessFile.seek(0);
        randomAccessFile.readFully(b);
        long endRead=this.getTimer();
        double timeTaken=(endRead-startWrite)/1000000000.0;
        double data=10.0;
        double throughput=data/timeTaken;
        double latency=(endLatency-startWrite)/1000000.0;//time for the reception of 1 byte
        System.out.println(timeTaken);
        System.out.println(data);
        System.out.println("Throughput="+throughput+" Mb/s");
        System.out.println("Latency="+latency+" ms");
        randomAccessFile.close();
    }
    catch (Exception e) {
        e.printStackTrace();
        randomAccessFile.close();
    }
}

@Override
public long getTimer() {
    // TODO Auto-generated method stub
    return System.nanoTime();
}
}

我得到的输出为

56.065550577
10.0
Throughput=0.17836264688538242 Mb/s
Latency=0.057668 ms

我有一台速度相当快的电脑,1TB 硬盘 @ 5400 Rpm,Intel i7 四核 @2.1Ghz,8GB ddr 3 Ram。有人可以告诉我吞吐量是否会那么低,还是我使用了错误的方法?

4

3 回答 3

2

这个数字对我来说似乎是正确的。您正在进行大量的系统调用。178K 系统调用/秒对于 2.1 GB i7 来说是正确的。在 3.5 GHz I7 上,您每秒可以获得大约 300K 的系统调用。

第一次运行一个方法时,它必须被加载,这会减慢它的速度。尽管在这个阶段它没有编译为本机代码,但还是需要做一些工作,而且 57 微秒的延迟对于第一次调用来说似乎是合理的。

于 2013-01-27T17:56:50.450 回答
1

我敢肯定那里有很多磁盘基准测试......谷歌提供了很多链接。查看面向基准测试的网站,他们可能会发布他们的工具以使结果可重复。使用它们,以便您可以与其他地方获得的结果进行比较。除非您有兴趣对一些非常具体的特殊情况进行基准测试,否则就是这样。在这种情况下,您最好测量您的案例的性能,包括整个堆栈:程序、编译器、操作系统和硬件。

于 2013-01-29T12:56:58.343 回答
0

只要您在您正在测试的所有 HD 或平台上使用相同的代码,对我来说似乎是合理的。我确实认为,对于较大的顺序写入测试,您可能想尝试一次写入几个字节而不是标志,这样可以更清楚地解释正在写入的数据量。

这是我在 java 中编写的用于对磁盘 IO 进行基准测试的实用程序: https : //sourceforge.net/projects/jdiskmark/ 如果我可以像您的代码一样添加延迟检查会很好,但它在带宽方面做得很好。您可以在gitlab上查看代码。

于 2016-04-09T22:19:47.013 回答