4

どのような種類の操作がCPU負荷に不均衡に寄与するかを理解し、一般的な操作の相対的なコストについての直感を身に付けたいと思います。一般化を最小限に抑えるために、Oracle 7HotSpotJVMを想定してください。

例えば:

  • たくさんのオブジェクトを構築するにはCPUが必要ですか(メモリがかかることは理解しています:-))?
  • モニターのコンテンツにはCPUが必要ですか?つまり、複数のスレッドが同じ同期ブロックに入ろうとしている場合、ブロックされたスレッドもCPUサイクルを消費しますか?
  • 上記の操作の相対的なコスト?たとえば、「単一のオブジェクトを新規作成すると、X要素配列を反復処理するのと同じCPUのコストがかかります」

典型的な操作の相対的なCPUコストの直感を開発するためのヒントはありますか?

あなたがお勧めできる主題についての良い読み物はありますか?

ありがとうございました、

明確化

早い回答に感謝しますが、私に注意してください:

  • 「なぜ私のアプリは遅いのか」と尋ねていません
  • プロファイラーを使用すると特定のアプリの問題を特定するのに役立つこと、たとえば、GCがCPUを消費する可能性があること、またはGCの永続的な生成はEdenスペースよりもコストがかかることを理解してください
  • ほとんどの操作は、大量に実行された場合にのみコストがかかることを理解してください(つまり、控えめに使用された場合、実質的に操作は高価ではありません)

代わりに、特に上記の操作での相対的なCPUコストのガイダンスを探しています(「Webスケール」アプリが上記のすべての操作を同じ量で使用すると仮定しましょう-たくさん)。

たとえば、私はすでにそれをしています:

  • 長いメソッド呼び出しチェーンはCPU負荷に大きく影響しません(したがって、メソッド委任を自由に使用することは一般的に問題ありません)
  • 例外をスローすることは、条件を使用するよりもコストがかかります(したがって、パフォーマンスに非常に敏感なコードのフロー制御には、一般的に後者が推奨されます)

...しかし、新しいオブジェクトのインスタンス化やモニターのコンテンツについてはどうでしょうか?これらの操作のいずれかが、大規模なCPU負荷(レイテンシーやヒープサイズを気にしないとしましょう)に大きく貢献しますか?

4

3 に答える 3

2

単一の操作は常に高速です。測定可能な CPU 負荷は、操作​​が数千回、さらには 100 万回または 10 億回実行されます。そのため、あらゆる種類のループや重度の再帰呼び出しに注意する必要があります。

多くの場合、明らかなループは 100 回しか実行されないため、何かが 100 万回実行されたかどうかは明らかではありません。しかし、何かを 100 回実行する関数を呼び出します。この関数には、操作を 100 回実行する別の関数が含まれています。そうすれば、何かが何百万回も実行されることになります。また、Web アプリでは、同時要求の数が乗算されます。

実際のホット スポットを特定するのは簡単ではないため、Java 用の特別なパフォーマンス分析ツールを使用してアプリケーションを調査することをお勧めします。そうすることで、CPU を集中的に使用するパターンとそうでないパターンを知ることができます。

Java のもう 1 つの問題は、すぐに解放できない大量のメモリ (いくつかの大きなチャンクと多くの小さなチャンク) を割り当てると、ガベージ コレクションが CPU を大量に消費する可能性があることです。大量の文字列を使用すると (XML を処理する場合など)、そのような原因になる可能性があります。

しかし、最善の方法は、分析ツールを使用することです。

于 2012-10-19T18:44:17.247 に答える
1

例外のスローは非常に安価です。高価な部分は通常、例外オブジェクトの作成のみfillInStackTrace()です。これは高価な を呼び出すためです。これを省略した場合、残りは高速です (C の goto と同じくらい高速になる可能性があります)。

ソース: https://blogs.oracle.com/jrose/entry/longjumps_considered_inexpensive

詳細については、パフォーマンスに関する情報を一覧表示する OpenJDK JVM に関する内部情報を含むページを次に示します。

于 2013-03-04T11:17:40.453 に答える
1

あなたが書いた相対的なCPU消費量は次のとおりだと思います:

1) 配列のインデックス付け; これは速い; それはただのアドレスです

2) モニター -- 遅い。中断および待機中のスレッドは CPU を消費せず、切り替えは CPU をほとんど消費しませんが、インデックス作成よりも多くの CPU を消費します

3) オブジェクトが複雑でサブオブジェクトの作成を引き起こす場合、オブジェクトの作成が遅くなる可能性があります。new Object()スレッド切り替えよりもわずかに遅いシングルを作成します。しかし、私は間違っているかもしれませんが、それは同じです。とにかく匹敵する

4) 例外のスロー/キャッチは非常に遅いです。オブジェクトを作成するよりも 10 倍から 100 倍遅い

于 2012-10-19T19:16:02.057 に答える