1
long start = System.nanoTime ();           // 1
//whatever operations                      // 2
long elapsed = System.nanoTime () - start; // 3

ステートメント 1 とステートメント 3 を混ぜ合わせて、時間を正確に測定できない可能性はありますか?

--------------すべてのフィードバックに感謝します。コードを次のように変更しましょう。

long start = System. currentTimeMillis ();           // 1
try { Thread.sleep (1000); } catch (Exception e) {}  // 2
long elapsed = System. currentTimeMillis () - start; // 3

質問を次のように変更します: 1 2 3 の実行を 1 3 2 に並べ替えることができますか? もしそうなら、どうやって 2 にかかる時間を測定できますか?

4

1 に答える 1

1

を呼び出していなくても、に割り当てられた式でSystem.nanotTime()を使用しているため、JVM も CPU もこれらの命令を並べ替えません。いずれにせよ、並べ替えを防止するネイティブ システム コールを生成するようにバインドされています。startelapsedSystem.nanoTime()

とはいえ、この種の時間測定が意味をなすためには、呼び出しの間にあるものはすべてSystem.nanoTime()少なくとも数十万の命令で構成されているため、並べ替えはとにかく不可能であると予想されます。

時間指定されたコードが短すぎると、一部のオペレーティング システムで提供される高解像度タイマーを含め、コンピューター タイマー固有の精度の問題により、使用可能なタイミング結果を生成できなくなります。

于 2013-02-17T19:47:16.993 に答える