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

私は、1 TB ハードディスク @ 5400 Rpm、クアッド コア @ 2.1 Ghz の Intel i7、8 GB ddr 3 RAM を搭載したかなり高速なコンピューターを持っています。スループットがそれほど低くなるのか、それとも間違ったアプローチを使用しているのか、誰か教えてもらえますか?

4

3 に答える 3

2

数は私にはほぼ正しいようです。非常に多くのシステム コールを実行しています。178K のシステム コール/秒は、2.1 GB の i7 にほぼ適しています。3.5 GHz の I7 では、1 秒あたり約 300K のシステム コールを取得できます。

メソッドを初めて実行するときは、メソッドをロードする必要があり、これにより速度が低下します。このフェーズではネイティブ コードにコンパイルされていませんが、いくつかの作業を行う必要があり、最初の呼び出しでは 57 マイクロ秒のレイテンシが妥当と思われます。

于 2013-01-27T17:56:50.450 に答える
1

そこにはたくさんのディスクベンチマークがあると確信しています... Googleはたくさんのリンクを提供しています。ベンチマークに適したサイトを見てください。おそらく、結果を再現可能にするツールを公開しています。それらを使用して、他の場所で得られた結果と比較できます。非常に特定の特殊なケースのベンチマークに興味がない限り、つまり。その場合は、スタック全体 (プログラム、コンパイラ、オペレーティング システム、およびハードウェア) を含めて、ケースのパフォーマンスを測定することをお勧めします。

于 2013-01-29T12:56:58.343 に答える