1

最後にパターンを持つ非常に長い文字列があり</value>、いくつかの関数呼び出しのパフォーマンスをテストしようとしているので、答えを見つけるために次のテストを行いました...しかし、nanoTimeを使用している可能性があると思います間違って?いくら順番を入れ替えても結果が意味をなさないので…

  long start, end;

  start = System.nanoTime();
  StringUtils.indexOf(s, "</value>");
  end = System.nanoTime();
  System.out.println(end - start);

  start = System.nanoTime();
  s.indexOf("</value>");      
  end = System.nanoTime();
  System.out.println(end - start);

  start = System.nanoTime();
  sb.indexOf("</value>");
  end = System.nanoTime();
  System.out.println(end - start);

私は以下を取得します:

163566    // StringUtils
395227    // String
30797     // StringBuilder

165619    // StringBuilder
359639    // String
32850     // StringUtils

どの順序で入れ替えても、数値は常に多少同じになります..どうしたの?

java.sun.com Web サイトの FAQ から:

コード内のさまざまなポイント間で System.nanoTime() を使用して経過時間の測定を実行すると、常に正確になります。

また:

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime ()

4

3 に答える 3

2

2 回の実行の差はマイクロ秒単位であり、これは予想どおりです。アプリケーションの 2 回の実行間で実行環境が同じになることがないように、マシン上で多くのことが行われています。だからこそ、あなたはその違いを得るのです。

編集: Java API は言う:

この方法ではナノ秒の精度が得られますが、必ずしもナノ秒の精度とは限りません。

于 2011-11-22T15:14:46.940 に答える
1

ほとんどの場合、メモリの初期化の問題や、数値を歪めている JVM の起動時に発生するその他の問題があります。より正確な数値を得るには、より大きなサンプルを取得する必要があります。注文をいじったり、複数回実行したりします。

于 2011-11-22T15:19:28.980 に答える
1

チェックするメソッドは、バックグラウンドで一般的なコードを使用している可能性が高くなります。しかし、JIT は約 10.000 回の呼び出し後にのみ機能します。したがって、これが最初の 2 つの例が常に遅いように見える原因である可能性があります。

簡単な修正: 長い十分な文字列を最初に測定する前に、3 つのメソッド呼び出しを実行するだけです。

于 2011-11-22T15:19:31.920 に答える