我试图通过针对一个简单的程序运行它们来测试一些基准测试工具,该程序将变量尽可能多地递增1000毫秒。
我希望能够在JDK for Mac OS X上的intel i7芯片上执行多少64位数的增量?
我目前的方法是:
目前,我可以重复地获得2E8增量(这是下表:显示的值是在调用线程中1000毫秒sleep()后递增线程被中断时打印的值)。
217057470
223302277
212337757
215177075
214785738
213849329
215645992
215651712
215363726
216135710
我怎么知道这个基准是否合理,即i7芯片应该能够增加一个64位数的理论最快速度是多少?此代码在JVM中运行,如下所示:
package net.rudolfcode.jvm;
/**
* How many instructions can the JVM exeucte in a second?
* @author jayunit100
*/
public class Example3B {
public static void main(String[] args){
for(int i =0 ; i < 10 ; i++){
Thread addThread = createThread();
runForASecond(addThread,1000);
}
}
private static Thread createThread() {
Thread addThread = new Thread(){
Long i =0L;
public void run() {
boolean t=true;
for (;;) {
try {
i++;
}
catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void interrupt() {
System.out.println(i);
super.interrupt();
}
};
return addThread;
}
private static void runForASecond(Thread addThread, int milli) {
addThread.start();
try{
Thread.sleep(milli);
}
catch(Exception e){
}
addThread.interrupt();
//stop() works on some JVMs...
addThread.stop();
}
}
答案 0 :(得分:2)
首先要注意JVM优化!你必须确保你准确地测量你的想法。由于Long i =0L;
不是volatile
而且它实际上没用(对中间值没有任何作用)JIT可以做很讨厌的事情。
至于估算,你可以想到在X GHz机器上每秒不超过X * 10 ^ 9次操作。您可以安全地将此值除以10,因为指令未按1:1进行映射。
所以你非常接近:)
答案 1 :(得分:2)
理论上,做出一些可能无效的假设:
然后你可以说1秒内2,500,000,000个增量是一个“合理的”上限,基于最简单的可能后验估计。
你的测量距离有多远?
O(1,000,000,000)
O(100,000,000)
所以我们只有1个数量级。鉴于完全没有根据的假设 - 听起来对我来说很合理。