私はJavaで簡単なチェッカーゲームを書いています。ボード上にマウスを置くと、プロセッサは最大50%(コアでは100%)まで上昇します。
この間にコードのどの部分が(私の障害を想定して)実行されているのかを知りたいです。
デバッグを試しましたが、この場合、ステップスルーデバッグはうまく機能しません。
問題がどこにあるかを教えてくれるツールはありますか?私は現在Eclipseを使用しています。
私はJavaで簡単なチェッカーゲームを書いています。ボード上にマウスを置くと、プロセッサは最大50%(コアでは100%)まで上昇します。
この間にコードのどの部分が(私の障害を想定して)実行されているのかを知りたいです。
デバッグを試しましたが、この場合、ステップスルーデバッグはうまく機能しません。
問題がどこにあるかを教えてくれるツールはありますか?私は現在Eclipseを使用しています。
これは「プロファイリング」と呼ばれます。IDEにはおそらく1つ付属しています。Javaのオープンソースプロファイラーを参照してください。
プロファイラーを使用する(例:yourkit)
一言で言えば、プロファイラーは、プログラムのどの部分が何回呼び出されているかを教えてくれます。
プログラムのプロファイリングはあまり行っていないので、あまり経験はありませんが、テスト中にNetBeansIDEプロファイラーを試してみました。(私は通常Eclipseも使用します。Eclipseのプロファイリング機能についても調べます。)
NetBeansプロファイラは、どのスレッドがどのくらいの時間実行され、どのメソッドがどのくらいの時間呼び出されたかを示し、各メソッドにかかった時間を示す棒グラフを提供します。これにより、どの方法が問題を引き起こしているかについてのヒントが得られるはずです。興味があれば、NetBeansIDEが提供するJavaプロファイラーを確認できます。
プロファイリングは、プログラムのどの部分が多くの実行時間を費やしているかを測定するために通常使用される手法であり、最適化の実行がプログラムのパフォーマンスを向上させるのに有益かどうかを評価するために使用できます。
幸運を!
プロファイリング?使用しているIDEはわかりませんが、Eclipseにはまともなプロファイラーがあり、 java-sourceにはいくつかのオープンソースプロファイラーのリストもあります。
Sun Java 6を使用している場合、最新のJDKリリースにはbinディレクトリにJVisualVMが付属しています。これは、使用するのにほとんど労力を必要としない有能な監視およびプロファイリングツールです-特別なパラメータでプログラムを開始する必要はありません-JVisualVMは、現在実行中のすべてのJavaプロセスを一覧表示し、操作したいプロセスを選択します。
このツールは、どのメソッドがすべてのプロセッサ時間を使用しているかを示します。
そこにはもっと強力なツールがたくさんありますが、最初に無料のツールで遊んでください。次に、他にどのような機能が利用できるかを読むと、それらがどのように役立つかについての情報が得られます。
1)それはあなたのせいです:)
2)EclipseまたはNetBeansを使用している場合は、プロファイリング機能を使用してみてください。コードが多くの時間を費やしている場所がすぐにわかります。
3)それが失敗した場合は、内側のループがあると思われる場所にコンソール出力を追加します。すぐに見つけることができるはずです。
プロファイラーを使用します。沢山あります。リストは次のとおりです:http://java-source.net/open-source/profilers。たとえば、Javaコード化プロファイラーであるJIPを使用できます。
これは通常、「CPU 使用率が高い」問題です。
ハイ CPU の問題には 2 種類あります
a) スレッドが 1 つのコアの 100% の CPU を使用している場所 (これはあなたのシナリオです)
b) 特定のアクションを実行すると、CPU 使用率が「異常に高く」なります。このような場合、CPU は 100% ではないかもしれませんが、異常に高くなります。通常、これは、XML 解析、シリアライゼーション デシリアライゼーションなどのコードで CPU を集中的に使用する操作がある場合に発生します。
ケース (a) は分析が容易です。30 秒間隔で 100% の CPU 5-6 スレッド ダンプが発生した場合。アクティブ (「実行可能」状態) で、同じメソッド内にあるスレッドを探します (スレッド スタックを監視することで推測できます)。ほとんどの場合、「ビジー待機」が表示されます (例については、以下のコードを参照してください)。
while(true){
if(status) break;
// Thread.sleep(60000); // such a statement would have avoided busy wait
}
ケース (b) も、等間隔で取得されたスレッド ダンプを使用して分析できます。運が良ければ、問題のコードを見つけることができます。スレッド ダンプを使用して問題のコードを特定できない場合は、問題のコードを見つけることができます。プロファイラーに頼る必要があります。私の経験では、YourKit プロファイラーは非常に優れています。
私は常に最初にスレッド ダンプを試します。プロファイラーは最後の手段にすぎません。80% のケースで、スレッド ダンプを使用して識別できます。
Cloverは、各行と分岐のヒット数を示す優れたレポートを提供します。たとえば、この行は 7 回実行されました。
Eclipse、Maven、Ant、および IDEA 用のプラグインが利用可能です。オープン ソースは無料ですが、30 日間の評価ライセンスを取得できます。
または、JUnit テスト ケースとコード カバレッジ ツールを使用して、いくつかの一般的なコンポーネントを作成します。他のコンポーネントを呼び出すコンポーネントがある場合、それらが何度も実行されていることがすぐにわかります。
私は JUnit テスト ケースで Clover を使用していますが、オープン ソースの場合は EMMA がかなり優れていると聞きます。
シングルスレッド コードでは、次のようなステートメントをいくつか追加しています。 System.out.println("A: "+ System.currentTimeMillis()); プロファイラーを使用するのと同じくらい簡単で効果的です。問題の原因となっているコードの部分をすぐに絞り込むことができます。