我正在尝试对我的硬盘进行基准测试,并以毫秒为单位查找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。有人能告诉我吞吐量是低还是我使用了错误的方法?
答案 0 :(得分:2)
这个号码对我来说似乎是正确的。您正在进行大量的系统调用。 178K系统呼叫/ s适用于2.1 GB i7。在3.5 GHz I7上,您每秒可以获得大约300K系统调用。
第一次运行方法时,必须加载它,这会减慢它的速度。即使在此阶段没有编译为本机代码,也必须完成一些工作,并且第一次调用时延迟为57微秒似乎是合理的。
答案 1 :(得分:1)
我确信那里有很多的磁盘基准测试...... Google提供了很多链接。看看面向基准测试的网站,他们可能会发布他们的工具以使结果可重复。使用它们,以便与其他地方获得的结果进行比较。除非你有兴趣对一些特定的特殊情况进行基准测试,否则就是这样。在这种情况下,您最好测量您的案例的性能,包括整个堆栈:程序,编译器,操作系统和硬件。
答案 2 :(得分:0)
对我来说似乎是合理的。我认为对于较大的顺序写入测试,您可能希望尝试将多个字节作为时间而不是标志写入,从而更清楚地解释正在写入的数据量。
这是我用java编写的用于对磁盘IO进行基准测试的实用程序: https://sourceforge.net/projects/jdiskmark/ 如果我可以像你的代码一样添加延迟检查,那将是很好的,但是带宽可以正常工作。您可以在gitlab上查看代码。