0

簡単な数独ソルバーを作成しました。パフォーマンスを大まかにテストするために、単純なSystem.currentTimeMillis呼び出しを使用しています。

数独の初期設定をテキストファイルで用意しました。プログラムはファイルを読み取り、各数独構成を解決します。テストを実行すると、最初の 3 ~ 4 回のソルバ実行が残りの実行よりも非常に遅く、速度が遅いということは桁違いに遅いことに気付きました。

サンプルの疑似コード スニペットがあります。

main(){
     while(file has lines){
         configuration = readLine();
         Solver s = new Solver(configuration);

         now1 = System.currentTimeMillis();
         s.solve();
         now2 = System.currentTimeMillis();

         System.out.print(now2 - now1);
     }
}

私はsolve()メソッドのみを測定するので、IO は問題ではありません。一部のデータをプログラムにハードコーディングしましたが、それでも最初のいくつかは遅くなりました。パズルの難しさも問題ではありません。さまざまな順列と構成の難しさを試しましたが、常に同じです。最初のいくつかは遅くなります。

私の質問は - それはなぜですか、それを防ぐ方法はありますか?

4

3 に答える 3

6

これは起こるはずです。JIT コンパイラーは、プログラムの実行時間が長くなるほど頻繁に呼び出されるコードを最適化します。

これは、パフォーマンスをテストするために使用している手法が Java では信頼できないという一般的な事実を反映しているだけです。

于 2013-02-06T18:39:14.990 に答える
2

実際には、メソッドは、JITによって呼び出されたときに初めてコンパイルされることはありませんJVM。メソッドごとに、はJVMを維持しcall countます。これは、メソッドが呼び出されるたびに増分されます。は、メソッドがを超えるJVMまでメソッドを解釈します。したがって、頻繁に使用されるのは、が開始された直後であり、あまり使用されないものは、はるかに後でコンパイルされるか、まったくコンパイルされません。これにより、迅速に開始できます。call countJIT compilation threshold methodscompiledJVM methodsJIT compilation ThresholdJVM

したがって、 Javaプログラムの最もビジーなメソッドは常に最も積極的に最適化さ れ、プログラムによって呼び出されるたびに実行速度が向上します。

上記の情報のソースは次のとおりです

于 2013-02-06T18:47:53.773 に答える
1

パフォーマンス テストの契約では、テスト対象のシステムをしばらく実行して、安定した状態にします。そうして初めて、パフォーマンス メトリックを開始します。同じことを試すかもしれません: メトリクスを取得する前に、solve() メソッドを何度も実行します。

于 2013-02-06T18:45:41.463 に答える