2012-01-21 5 views
1

私はいくつかの同時アルゴリズムをテストできるように、CPU時間を固定してCPUをスピンさせて偽の "仕事"をシミュレートする方法を探しています。基本的には、スレッドにCPU時間のN秒かかる何かをさせる方法を探しています。一定のCPU時間の間、プロセッサをスピンさせます

私の最初の実装は次のようなものだった:

public void doWork() { 
    long startTime = System.currentTimeMillis(); 
    while(System.currentTimeMillis() - startTime < mDurationMillis) { 
     //Churn 
    } 
    System.out.println("Task " + mTaskId + " on thread " + Thread.currentThread().getId() + ": done work!"); 
} 

をしかし、私はすぐに、これは本物の時間を測定していることに気づき、および100のなどのタスクは、単一のプロセッサ上で1としてほぼ同時にフィニッシュだろう。実行中にスレッドが使用したCPU時間を測定する方法はありますか?

+5

実際に使用するアルゴリズムの種類と量に典型的な* real * workを使用することを強くお勧めします。実際に使用する予定の仕事とは違う仕事でテストすると、無意味なテスト結果が得られる可能性が非常に高いです。現代のCPUでは、I/O重い(またはシステムコール重い)コードの並行動作は、浮動小数点数の多いコードとは異なるメモリアクセス重いコードとは非常に異なることになります。 –

+0

競合するスレッドをたくさん(例えば100個)実行し、タイミングの変化をシミュレートするためにそれらを 'Thread.sleep(randomMilliseconds)'にすることをお勧めします。並行性に問題がある場合は、適切なテストでこのアプローチを見つけることができます。 – Bohemian

+0

質問を理解することに困っています。タスクが1つのスレッドで実行され、すべての時間測定がタスク内で実行された場合、CPU時間は実際の(壁時計とも呼ばれる)時間と(大幅に)異なるのはなぜですか?そして、なぜ100個のタスクが1つのプロセッサーとほぼ同じ時間に完了すると思いますか? –

答えて

0

ほとんどグーグルでは、a usage exampleだけでなく、あなたが必要と思われるThreadMXBean interfaceが見つかりました。しかし、私はJava開発者ではありませんので、塩分を入れておいてください。