私は、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();
}
}