「array.length」へのアクセスのパフォーマンス コスト
Q: 「array.length」の呼び出しは、通常の変数にアクセスしていますか?
for ループを for-each ループに変換してコードを最適化しようとすると、多くの開発者は次のような構造に遭遇します。
for (int i = 0, n = a.length; i < n; i++) { ... }
ここで、 a は配列です。 。 n を a.length で初期化すると、n を完全に省略する場合と比較してパフォーマンスが低下するかどうかを疑問視する人もいます:
for (int i = 0; i < a.length; i++) { ... }
A: いいえ、'array.length' の呼び出しには定数時間がかかります (O(1)) cost.
呼び出しごとにパフォーマンスのオーバーヘッドが発生するコレクションの size() メソッドとは異なり、array.length へのアクセスはローカル変数の読み取りと同等です。これは、array.length が配列クラスのパブリック最終メンバーであるため、他の変数と同じくらい高速にアクセスできるためです。
JIT コンパイラーによる最適化
モダンジャストインタイム (JIT) コンパイラーは、多くの場合、array.length への呼び出しを完全に排除することで、呼び出しを最適化します。これは、コンパイラがループの実行を通じて配列の長さが一定であると判断できるためです。
コード分析による確認
array.length へのアクセスの効率は、 JVM の JIT コンパイラによって生成されたネイティブ コードを調べることによって検証できます。ほとんどの場合、array.length の呼び出しは最適化されます。
ルールの例外
JIT コンパイラーが実行できないシナリオがいくつかあります。 array.length アクセスを最適化するには:
以上が## 「array.length」へのアクセスは本当にパフォーマンスのボトルネックですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。