jvm-コンパイル最適化を深く理解する(下)


前言


ここでは、上記の内容に続いて、jvm-コンパイル最適化を深く理解する(上)について説明します.

概要

  • バックエンド最適化の他のコンテンツプリコンパイラの処理
  • を補完する.
  • jvmのいくつかの重点最適化措置を紹介する
  • メソッドインターコネクト(重要)
  • 脱出分析(先進)
  • 共通サブエクスプレッション消去(クラシック)
  • 配列境界チェック消去(言語古典)

  • バックエンドの最適化


    プリコンパイラ


    プリコンパイラの歴史は長いですが、javaの分野でandirodの台頭を知ってjavaに注目されています.プリコンパイラについて説明する前に、プリコンパイラの優劣を見てみましょう.

    メリット

  • インスタントコンパイラがプログラム内で演算リソースを占有することを解決する.
  • インスタントコンパイラによるキャッシュ加速
  • 事前にコンパイルされたコード品質.
    本の中で過程間分析とは何ですか.
    現在のjavaはプロセス間で最適化を分析する力が足りないと同時に,静的コンパイル方式が全プログラムで最適化できるためである.

  • JAvaの実践


    上記の利点に対してjdk 9はJactcプリコンパイラを実現した.プリコンパイラの利点について説明します.次に、インスタントコンパイラの利点を見てみましょう.
  • 性能分析指導最適化:いくつかの動的コードと抽象的な方法について、動的分析によって
  • を得ることができる.
  • の急進的な最適化:完全に正確な深さの最適化を保証することなく、保護プログラムに戻ることができます.
  • リンク時最適化:javaは、インスタントコンパイルによるローカルコードの生成を生まれつきサポートしています.

  • 事前にコンパイルした内容については、基本的な理解だけでいいです.次にjvmのより多くの下位最適化について見てみましょう.

    さいてきさいてきか


    次はjvmの下位最適化コンテンツについてです.jvmの下位最適化コンテンツは非常に多く、例えば、メソッドインライン、冗長重複除外、複写伝播、不要コード除去などです.ここでは本の中のいくつかの内容を選んで紹介します.
  • メソッドインターコネクト(重要)
  • 脱出分析(先進)
  • 共通サブエクスプレッション消去(クラシック)
  • 配列境界チェック消去(言語古典)
  • メソッドインライン


    意味:すなわち、インラインされた方法をインラインブロックの内部に運ぶ.簡単に言えば,多層メソッドネスト呼び出しを1つのメソッドに統合し,スタックフレームの堆積を低減する.
    どのように実現しますか?
    実装の前提条件:まず、非虚メソッド、すなわち虚メソッドによって呼び出されない静的メソッドである必要があります.
    CとC++は,明確な虚と非虚の方法を用いて限界を計画した.
    Javaの具体的な実装:タイプ継承関係の分析と実装を導入し、現在ロードされているクラスの中で、あるインタフェースに複数の実装があるかどうか、あるクラスにサブクラスがあるかどうか、あるサブクラスが親クラスの虚メソッドをカバーしているかどうかなどの情報を決定する」.
    上から簡単に言えば、以下の点にまとめることができます.
  • インタフェースのインプリメンテーションおよび
  • をインプリメントできるかどうかを決定する.
  • 継承関係があるかどうか
  • 書き換え方法があるかどうか
  • .

    逃げ方


    逃走解析の基本原理は、オブジェクトの動的役割ドメインを解析することであり、オブジェクトがメソッドで定義されると、呼び出しパラメータとして他のメソッドに渡されるなど、外部メソッドによって参照される可能性があります.
    1つのオブジェクトがメソッド定義で外部に参照される可能性があります.これは、スタック上の割り当て、スタック上の割り当てが簡単に言えば、スタック空間の開拓を低減し、メモリの回収効率を向上させる重要な最適化手段を示します.
    JAvaはメソッドの脱出のみをサポートし,スレッドの脱出はサポートしない.
    本の中で現在の逃走分析の状況を紹介するのは以下の通りである.
  • 改善空間が非常に大きい
  • jdk 6は
  • を初歩的にサポートしています.
  • は複雑なアルゴリズム
  • に関する.
    もう1つの最適化方法は、スカラーの置換です.
    スカラーとは何か:変数がより少ない単位表現(int,byte,booleanなど)ができない場合、これらの変数はスカラーになります.
    重合量とは:分解を続けることができるものを重合量と呼ぶ.
    スカラー置換:javaオブジェクトを分割し、プログラムのアクセス状況に応じてメンバー変数のリカバリとアクセスに使用します.
    脱出分析とスカラー置換を組み合わせて
    エスケープ解析では、外部からアクセスできず、表示されたオブジェクトをスカラーで置き換えることができます.オブジェクトは作成されません.同様に,メソッド内処理のみをサポートし,メソッド逃走はサポートしないことを改めて強調した.
    次に、同期消去の最適化を行います.
    同期消去:スレッド同期自体は相対的に時間がかかるプロセスであり、逃走分析が1つの変数がスレッドから逃走せず、他のスレッドにアクセスできないことを確定できれば、この変数の読み書きは競争せず、この変数に対する同期措置も安全に除去することができる.
    最後に、変数が逃げない場合は、同期解除措置を実行します.

    共通サブエクスプレッション


    共通サブエクスプレッションとは?1つの式Eが以前に計算され、以前の計算から現在のEのすべての変数の値が変化しなかった場合、Eの今回の出現は共通のサブ式と呼ばれる.この式では,再計算に時間を費やす必要はなく,Eの代わりに先に計算した式の結果を直接用いるだけである.
    ケース:
    int d = (c * b) * 12 + a + (a + b * c);

    式が1回計算されると、次のように置き換えられます.
    int d = E * 12 + a + (a + E);

    配列境界チェックの除去


    JAvaの配列はcおよびc++の配列とは異なり、裸ポインタで配列を操作するわけではないが、配列のアクセスの安全を保証するために、jvmの下層は毎回の操作のたびに配列の境界を検査操作する必要がある.すなわち、頭を含む尾を含まない判断である:[start,end).
    この問題に対してjavaは次のように最適化を考慮します.
  • 配列アクセス範囲を定義することができれば、理論的には配列アクセスの消費を相殺することができる
  • .
  • コンパイル中に完了する
  • まで繰り上げる.
  • 暗黙的異常処理:空のポインタや除数が0の異常など.

  • 最終処理:


    1つのsegment fault信号を用いて代替登録を行い,多数のアクセスがnullでない場合に空と判断する操作を行わないことを保証する.例外が発生すると、例外処理に移行し、例外を放出します.
    しかし,この処理方式には,ユーザ状態とカーネル状態の頻繁な変換が問題である.しかしhotspotは、実際の方法に基づいて、境界チェックを使用して消去するか、元のポリシーモードを使用して実行するかを動的に判断します.

    まとめ


    本節の内容は比較的に簡単で、主にjvmの最適化方式を述べて、後続の下位最適化方式を含んで、下位最適化に関する内容は実際には非常に多いが、本文は本の中で言及した4つの重要な最適化方式だけを記録した.

    最後に書く


    jvmについての基本的な内容は既に紹介済みで、次の節ではまとめです.