2

我正在尝试通过针对一个简单的程序运行一些基准测试工具来测试它们,该程序在 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();
}

}
4

2 回答 2

2

首先要注意 JVM 优化!你必须确保你准确地衡量你认为你做了什么。因为Long i =0L;不是volatile并且它实际上是无用的(没有对中间值做任何事情)JIT 可以做一些非常讨厌的事情。

至于估计,您可以想到在 X GHz 机器上不超过每秒 X*10^9 次操作。您可以安全地将这个值除以 10 可能是因为指令不是 1:1 映射的。

所以你很接近:)

于 2012-11-21T21:54:23.010 回答
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)

所以我们只差了一个数量级。鉴于这些毫无根据的假设——对我来说听起来很合理。

于 2012-11-21T21:54:28.960 回答