2

私は、1000ミリ秒の間、変数を可能な限り多くインクリメントする単純なプログラムに対してそれらを実行することによって、いくつかのベンチマークツールをテストしようとしています。

Mac OSX用のJDKのInteli7チップで実行できると期待できる単一の64ビット数のインクリメントはいくつですか?

私の現在の方法論は:

  • 無限ループ(for(;;;))で「i」を継続的にインクリメントするスレッド(t2)を開始します。
  • メインスレッド(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はかなり厄介なことを行うことができます。

見積もりについては、XGHzマシンで1秒あたりX* 10^9回以下の操作を考えることができます。おそらく命令が1:1にマップされていないため、この値を10で安全に分割できます。

だからあなたはかなり近いです:)

于 2012-11-21T21:54:23.010 に答える
2

理論的には、おそらく有効ではないいくつかの仮定を行います。

  • 1つの命令で数値を増やすことができると仮定します(おそらく、JVMで実行していて、ネイティブではないため、そうではありません)
  • 2.5 GHzプロセッサが1秒あたり2,500,000,000命令を実行できると仮定します(ただし、実際には、それよりも複雑です)。

次に、1秒間に2,500,000,000の増分が、可能な限り最も単純な封筒裏の計算に基づく「合理的な」上限であると言えます。

それはあなたの測定からどれくらい離れていますか?

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

したがって、1桁だけずれています。非常に根拠のない仮定を考えると、私には合理的に聞こえます。

于 2012-11-21T21:54:28.960 に答える