「ホットスポットは Java の境界チェックを削除できます。」誰でもこれを説明できますか?実際に C++ と Java の違いを分析しています。それは宿題ではなく、私自身の興味で分析しています。
2 に答える
「hotspot 境界チェック」をグーグルで検索すると、「Java HotSpot™ Client Compiler の配列境界チェックの除去」というタイトルの論文が(最初の結果として) 表示され、いくつかの洞察が得られます。
概要:
配列要素がアクセスされるたびに、Java 仮想マシンは比較命令を実行して、インデックス値が有効な境界内にあることを確認します。これにより、Java プログラムの実行速度が低下します。配列境界チェックの削除は、そのようなチェックが冗長であり、削除できる状況を識別します。ジャストインタイム コンパイラでの静的解析に基づく Java HotSpot™ VM の配列境界チェック除去アルゴリズムを提示します。
このアルゴリズムは、静的な単一代入形式の中間表現で機能し、インデックス式の条件を維持します。境界チェックが失敗しないことが証明できる場合は、境界チェックを完全に削除します。可能な限り、境界チェックをループの外に移動します。チェックの静的数は変わりませんが、ループ内のチェックはより頻繁に実行される可能性があります。このようなチェックが失敗した場合、実行中のプログラムはインタープリター モードにフォールバックし、例外が間違った場所にスローされるという問題を回避します。
この評価では、科学的 SciMark ベンチマーク スイートの理論上の最大値 (平均 40%) に近いスピードアップが示されています。このアルゴリズムは、SPECjvm98 ベンチマーク スイートの実行速度も向上させます (平均 2%、最大 12%)。
マーク・メイヨーはこれをうまく説明しました。
結論: Hotspot が配列の境界をチェックする必要がないことを検出した場合、これをその配列の境界チェックを無効にする機会と見なし、パフォーマンスを向上させます。
プログラムのパフォーマンスを継続的に分析して、頻繁にまたは繰り返し実行される可能性のある「ホットスポット」を探します。これは、パフォーマンスが重要でないコードのオーバーヘッドを最小限に抑えてパフォーマンスを最適化するための最適化の対象となります。
したがって、理論的には、いくつかの境界チェックがあり、繰り返し頻繁に実行することで境界を超えることが不可能であることが明らかな場合、ホットスポットはそれらのチェックを最適化する可能性があります。間違いがないというわけではありませんが、それが原因の 1 つかもしれません。
Würthinger らによる2007 年の記事から: 「配列要素にアクセスするたびに、Java 仮想マシンは比較命令を実行して、インデックス値が有効な境界内にあることを確認します。これにより、Java プログラムの実行速度が低下します。配列境界チェックの除去により、識別が行われます。そのようなチェックが冗長であり、削除できる状況. ジャストインタイム コンパイラでの静的解析に基づく Java HotSpot™ VM の配列境界チェック除去アルゴリズムを提示します。