2011-10-23 2 views
15

私はコードの経過時間を測定するためにSystem.nanoTime()で次のコードを使用しようとしています。System.nanoTime()を使用して負の経過時間が得られるのはなぜですか?

public static void main(String[] args) throws Exception { 
    while (true) { 
     long start = System.nanoTime(); 
     for (int i = 0; i < 10000; i++) 
      ; 
     long end = System.nanoTime(); 
     long cost = end - start; 
     if (cost < 0) { 
      System.out.println("start: " + start + ", end: " + end + ", cost: " + cost); 
     } 
    } 
} 

そして、私はこのような結果を得る:私は負の値を取得するのはなぜ

start: 34571588742886, end: 34571585695366, cost: -3047520 
start: 34571590239323, end: 34571586847711, cost: -3391612 
start: 34571651240343, end: 34571648928369, cost: -2311974 
start: 34571684937094, end: 34571681543134, cost: -3393960 
start: 34571791867954, end: 34571788878081, cost: -2989873 
start: 34571838733068, end: 34571835464021, cost: -3269047 
start: 34571869993665, end: 34571866950949, cost: -3042716 
start: 34571963747021, end: 34571960656216, cost: -3090805 
start: 34571965020545, end: 34571961637608, cost: -3382937 
start: 34572010616580, end: 34572007613257, cost: -3003323 

を?

(OS:Windows XPのSP3、ジャワ:jdk1.6u27)

+4

は、Java(TM)SEランタイム環境(ビルド1.6.0_26-b03)でLinuxで再現できません。とにかく、なぜあなたは文句を言うのですか? Javaが90年代に遅れていた時、人々は不満を抱いていましたが、今は速すぎて、人々はまだ文句を言う:-) – stivlo

+1

私はちょうどコード実行時間を測定する正しい方法を見つけることができません。速くても遅いとも関係ありません。 – Freewind

+2

関連:http://stackoverflow.com/questions/3274892/why-is-my-system-nanotime-broken – stivlo

答えて

14

nanoTimeは、CPUクロック・サイクル・カウンタを利用することができます。わずかに異なる時間に異なるCPUを起動できるため、クロックカウンタはCPUによって異なる場合があります。 Linuxはこの問題を修正していますが、古いバージョンのWindowsでは修正されていません。 (私はあなたが離れて3ミリ秒離れて開始された2つのCPUを持っていると仮定します)

あなたは時々2.5ミリ秒以上の確実なジャンプを見るべきです。

if (cost < 0 || cost > 2000000) { 

を試してみて、あなたは前方に、いくつかのジャンプとプロセスがCPUの間で切り替えられるよう後方にいくつかのジャンプが表示されるはずです。

+0

あなたはかなり正しいです。新しい結果:-3494855、4185715、-3562463、3620073、4175502、3977789、-3500977、4125248 – Freewind

+0

私はそれがほぼ交互になると思います。特別な大きな肯定的な結果が得られた場合、そのプロセスは停止され、同じCPU上で再び開始される可能性がある。 –

関連する問題