8
class testx
{
  public testx()
  {
    long startTime = System.nanoTime();
    System.out.println((System.nanoTime() - startTime));
  }

  public static void main(String args[])
  {
      new testx();
      new testx();
      new testx();
  }
}

私はいつも this のような結果を得ます7806 660 517。最初の呼び出しに他の呼び出しの 10 倍の時間がかかるのはなぜですか?

4

2 に答える 2

22

JVM はその時点で初めて多数のクラスをロードするためです。それが最初System.nanoTime()に返されたら、すでにSystem.classとがロードされていますがtestx.class、いったんSystem.out.println全体像が見えてくると、多くの I/O クラスがロードされるのではないかと考えられます。これには時間がかかります。

いずれにせよ、これは良いベンチマーク手法ではありません。測定を開始する前に、〜 10000 回の反復で何かを実行して、JIT を実際にウォームアップする必要があります。代わりに (できれば)、 Caliperなどのビルド済みのベンチマーク ツールを使用します。

于 2012-08-17T19:57:45.637 に答える
3

それは間違いなく Louis Wasserman のようです。必要なすべてのSystemクラスをロードする必要があるため、最初のラウンドでは時間がかかります。クラスの新しいインスタンスを作成する前に空白を呼び出すことで、これを回避できますprintln()。これを行うとどうなるかを見てください。

public class testx
{
  public testx()
  {
    long startTime = System.nanoTime();
    System.out.println((System.nanoTime() - startTime));
  }

  public static void main(String args[])
  {
    //loads all System.* classes before calling constructor to decrease time it takes
    System.out.println();
      new testx();
      new testx();
      new testx();
  }
}

出力:

405 0 405

あなたの最初のコードが出力した場所:

7293 0 405

于 2012-08-17T20:25:10.787 に答える