2.5GHz Intel i7每秒递增

时间:2012-11-21 21:47:36

标签: java cpu benchmarking

我试图通过针对一个简单的程序运行它们来测试一些基准测试工具,该程序将变量尽可能多地递增1000毫秒。

我希望能够在JDK for Mac OS X上的intel i7芯片上执行多少64位数的增量?

我目前的方法是:

  • 启动线程(t2),在无限循环中连续递增“i”(for(;;;))。
  • 让主线程(称之为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();
}

}

2 个答案:

答案 0 :(得分:2)

首先要注意JVM优化!你必须确保你准确地测量你的想法。由于Long i =0L;不是volatile而且它实际上没用(对中间值没有任何作用)JIT可以做很讨厌的事情。

至于估算,你可以想到在X GHz机器上每秒不超过X * 10 ^ 9次操作。您可以安全地将此值除以10,因为指令未按1:1进行映射。

所以你非常接近:)

答案 1 :(得分:2)

理论上,做出一些可能无效的假设:

  • 假设一个数字可以在1条指令中递增(可能不是,因为你是在JVM中运行而不是本机运行)
  • 假设2.5 GHz处理器每秒可以执行2,500,000,000条指令(但实际上,它比这更复杂)

然后你可以说1秒内2,500,000,000个增量是一个“合理的”上限,基于最简单的可能后验估计。

你的测量距离有多远?

  • 2,500,000,000是O(1,000,000,000)
  • 2E8是O(100,000,000)

所以我们只有1个数量级。鉴于完全没有根据的假设 - 听起来对我来说很合理。