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