2

私は、パフォーマンスを向上させるためのアプリケーションのプロファイリングに少し慣れていません。プロファイラーとして YourKit を選択しました。YourKit が非常に興味深い統計を提供していることは間違いありません。私が立ち往生しているのは、これらの統計をどうするかということです。

たとえば、JAXB POJO で動作するメソッドを考えてみましょう。このメソッドは POJO を反復処理して、XML 内に深くネストされたタグ/要素にアクセスします。これには、以下に示すように、要素/タグに到達するために 4 層の for ループが必要です。

   List<Bundle> bundles = null;
   List<Item> items = null;
   for(Info info : data) { 
      bundles = info.getBundles();
      for(Bundle bundle : bundles) {
         items = bundle.getItems();
         //.. more loops like this till we get to the required element
       }          
    }

YourKit は、上記のコードが「ホットスポット」であり、このコードを含むメソッドへの呼び出しごとに 80 個のオブジェクトがガベージ コレクションを取得していることを教えてくれます。上記のコードは単なる例であり、私が行き詰まっている唯一の部分ではありません。ほとんどの場合、プロファイラーから提供された情報をどう処理すればよいかわかりません。上記のコードで一時オブジェクトの数を減らすにはどうすればよいですか? アプリケーションのパフォーマンスを改善するための明確に定義された原則はありますか? アプリケーションのプロファイルを作成する際に探すべき統計と、それぞれの種類の統計にはどのような意味がありますか?

編集: アプリケーションのプロファイリングの主な目的は、スループットと応答時間を向上させることです。現在のスループットは、必要なスループットのわずか 10% です。

4

3 に答える 3

1

私は与えられた答えに完全に同意します。

具体的な例を考慮して、 xpath APIを使用してXMLの特定の場所にアクセスすることで実際に改善できることを付け加えたいと思います。

DOM 全体を実際に反復する必要がない状況では、宣言型であり、表現力が高く、エラーが発生しにくいため、これを最初に選択する必要があります。

多くの場合、優れたパフォーマンスも得られます (非常に複雑なクエリの場合はそうではないかもしれませんが、単純なシナリオがあるようです)。

于 2012-09-13T15:20:47.583 に答える
1

パフォーマンス目標に関連する統計に注目してください。最小の応答時間に関心があるので、各メソッドが応答時間にどれだけ貢献しているかを調べ、大きく貢献しているメソッドに焦点を当てます (シングル スレッド処理の場合、単純にメソッド呼び出し中の経過時間であり、そのメソッドのすべての呼び出しを合計したものです)。YourKit が何をホット スポットとして定義しているかはわかりませんが (ドキュメントを確認してください)、おそらく累積経過時間が最も長いメソッドであるため、ホット スポットを確認することをお勧めします。対照的に、オブジェクトの割り当ては応答時間に直接影響を与えず、あなたの場合には無関係です (ガベージ コレクターが CPU 時間のかなりの割合を占めていることを特定した場合を除きますが、通常はそうではありません)。

于 2012-09-13T11:18:10.773 に答える
0

ループを改善する方法は、スキーマを変更し、本質的にモデルをフラット化することです。もちろん、これはスキーマを変更できるかどうかによって異なります。このようにして、生成された Java は 4 層のループを必要としません。もちろん、一日の終わりには、コードが本当に問題なのか自問する必要があります.80個のオブジェクトがGCされていますか? アプリケーションの実行速度が遅いですか? メモリの問題が発生していますか? 時期尚早の最適化は諸悪の根源であることを忘れないでください!

プロファイリングと最適化は複雑な作業であり、さまざまな要因 (Java バージョン、32 ビット OS と 64 ビット OS など) に依存します。さらに、最適化のために常にコードを変更する必要があるとは限りません。たとえば、JVM で GC ポリシーを変更することで問題を解決できます。たとえば、GC が必要な小さなオブジェクトをコードが多数作成している状況では、より効果的な GC ポリシーがあります。頻繁に。詳細があれば、おそらくあなたを助けるのが簡単になるでしょうが、あなたの質問は広すぎるようです. 実際、このトピックについて書かれた、読む価値のある本はたくさんあります。

于 2012-09-13T11:20:15.330 に答える