1

私は、10 から 50 ミリ秒の間、何百もの CPU バウンド ジョブを実行するシミュレーション プロジェクトを行っています。Job は、ジョブが CPU ビジー状態を維持する実行時間を指定した Runnable オブジェクトです。スレッド プールには、ジョブの到着を待機している 10 個のスレッドがあります。リクエスト レートを 1 秒あたり 40 リクエストに設定し、すべてのジョブの実行時間を 10 ミリ秒に設定しました。しかし、結果はとてもひどいものです。すべてのジョブは少なくとも 15 ミリ秒実行されます。10 ミリ秒実行されるジョブはありません。15ms のジョブで実験をテストしたところ、正しい結果が得られました。10 ミリ秒のジョブが少なくとも 15 ミリ秒実行されるのはなぜですか? (私は WINDOWS8 を使用しています)。

public class CpuBoundJob implements Runnable {
long runningTime
     public CpuBoundJob(long runningTime) {
        this.runningTime=runningTime;
          }
    @Override
    public void run() {

         long timeToWait = this.runningTime;
         long startTime = System.currentTimeMillis();
         while(startTime + timeToWait > System.currentTimeMillis());
}
}
4

1 に答える 1

1

多くのシステム (特に Windows、IIRC) では、System.currentTimeMillis()15 ミリ秒程度の精度しかないクロックに支えられています。

ただし、さらに悪いことに、システムクロックで測定された Unix エポックからの時間System.currentTimeMillis()を測定します。そのため、コンピュータの時刻を変更した場合 (たとえば、システム クロックを時刻源に同期したり、うるう秒やその他のさまざまな理由で)、任意に大量の時間を前後に移動することができます。currentTimeMillis()

経過時間を測定したい場合は、絶対に使用しないでくださいcurrentTimeMillis()System.nanoTime()代わりに使用してください。おまけとして、ほとんどのシステムでは、呼び出しが大幅に安価になり、大幅に正確になります。

于 2015-11-14T01:43:35.877 に答える