どのような種類の操作がCPU負荷に不均衡に寄与するかを理解し、一般的な操作の相対的なコストについての直感を身に付けたいと思います。一般化を最小限に抑えるために、Oracle 7HotSpotJVMを想定してください。
例えば:
- たくさんのオブジェクトを構築するにはCPUが必要ですか(メモリがかかることは理解しています:-))?
- モニターのコンテンツにはCPUが必要ですか?つまり、複数のスレッドが同じ同期ブロックに入ろうとしている場合、ブロックされたスレッドもCPUサイクルを消費しますか?
- 上記の操作の相対的なコスト?たとえば、「単一のオブジェクトを新規作成すると、X要素配列を反復処理するのと同じCPUのコストがかかります」
典型的な操作の相対的なCPUコストの直感を開発するためのヒントはありますか?
あなたがお勧めできる主題についての良い読み物はありますか?
ありがとうございました、
明確化
早い回答に感謝しますが、私に注意してください:
- 「なぜ私のアプリは遅いのか」と尋ねていません
- プロファイラーを使用すると特定のアプリの問題を特定するのに役立つこと、たとえば、GCがCPUを消費する可能性があること、またはGCの永続的な生成はEdenスペースよりもコストがかかることを理解してください
- ほとんどの操作は、大量に実行された場合にのみコストがかかることを理解してください(つまり、控えめに使用された場合、実質的に操作は高価ではありません)
代わりに、特に上記の操作での相対的なCPUコストのガイダンスを探しています(「Webスケール」アプリが上記のすべての操作を同じ量で使用すると仮定しましょう-たくさん)。
たとえば、私はすでにそれをしています:
- 長いメソッド呼び出しチェーンはCPU負荷に大きく影響しません(したがって、メソッド委任を自由に使用することは一般的に問題ありません)
- 例外をスローすることは、条件を使用するよりもコストがかかります(したがって、パフォーマンスに非常に敏感なコードのフロー制御には、一般的に後者が推奨されます)
...しかし、新しいオブジェクトのインスタンス化やモニターのコンテンツについてはどうでしょうか?これらの操作のいずれかが、大規模なCPU負荷(レイテンシーやヒープサイズを気にしないとしましょう)に大きく貢献しますか?