我正在尝试通过针对一个简单的程序运行一些基准测试工具来测试它们,该程序在 1000 毫秒内尽可能多地递增一个变量。
我应该期望能够在 Mac OS X 的 JDK 上的英特尔 i7 芯片上执行多少个 64 位数字增量?
我目前的方法是:
- 启动线程 (t2),它在无限循环 (for(;;;)) 中不断增加“i”。
- 让主线程(称为 t1)休眠 1000 毫秒。
- 有 t1 中断(或停止,因为这种不推荐使用的方法适用于 Apple 的 JDK 6) t2。
目前,我可重复地获得大约 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();
}
}