第11章. Java言語のパフォーマンス・テクニック
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
これまで、JVMが開発者の書いたコードを受け取り、バイトコードに変換し、高性能なコンパイル済みコードに最適化するメカニズムを探ってきた。
すべてのJavaアプリケーションが、パフォーマンスを念頭にアーキテクトされた、最高品質で原始的なコードで構成されていたら素晴らしいだろう。 しかし、現実はしばしば全く異なる。 にもかかわらず、多くの場合、JVMは最適でないコードを、それなりにうまく動作させることができる。これは、環境のパワーと堅牢性の証である。
非常識なコードベースを持ち、メンテナンスが困難なアプリケーションであっても、本番環境ではどうにか適切に動作させることができることが多い。 もちろん、そのようなアプリケーションのメンテナンスや修正を望む人はいない。 では、このようなコードベースをパフォーマンスのためにチューニングする必要がある場合、開発者に何が残されているのだろうか?
ネットワーク接続、I/O、データベースといったアプリケーションの外的要因に次いで、パフォーマンスの最大のボトルネックとなりうるのがコードの設計だ。 設計を正しく行うのは非常に難しい部分であり、完璧な設計などありえない。
注
Javaの最適化は複雑であり、第13章では、プロファイリング・ツールが、本来の性能を発揮していないコードの発見にどのように役立つかを見ていく。
にもかかわらず、パフォーマンスを重視する開発者が念頭に置くべきコードの基本的な側面がいくつかある。 例えば、アプリケーションにデータをどのようにストアするかは非常に重要である。データストアに利用できるオプションを理解するためには、Java Collections APIで利用できるデータ構造とその実装の詳細に精通することが重要である。
どのように更新され、クエリされるかを知らずにデータ構造を選択するのは危険である。開発者の中には、何も考えずに好きなクラスに手を伸ばして使ってしまう人もいるが、良心的な開発者は、データがどのようにクエリされるのか、どのアルゴリズムが最も効果的にデータをクエリできるのかを考えている。java.lang.Collections 、静的メソッドの形で提供されるアルゴリズムや演算子はたくさんある。
チップ
一般的なアルゴリズム(例えば、手作業で書かれたバブルソート)の実装を実運用コードで使用するために書く前に、java.lang.Collections に利用できるものがあるかどうかを確認する。
システム内のドメイン・オブジェクトとその寿命を理解することは、パフォーマンスに大きな影響を与える可能性がある。考慮すべきヒューリスティックがいくつかあり、アプリケーション内でドメイン・オブジェクトが使用される方法は、ガベージ・コレクションに影響を与え、オーバーヘッドを追加する可能性がある。
この章では、パフォーマンスを重視する開発者がコレクションについて知っておくべきことから始め、それぞれの懸念事項を探っていく。
コレクションの最適化
ほとんどのプログラミング言語ライブラリは、少なくとも2種類の一般化コンテナを提供している:
-
シーケンシャルコンテナは、数値インデックスで示される特定の位置にオブジェクトを格納する。
-
連想コンテナは、オブジェクトそのものを使って、オブジェクトがコレクション内のどこに格納されるべきかを決定する。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access