リンゴとオレンジを比較していると思います。Performance Myths リファレンスでは、フィールド アクセスに対する JIT の利点について説明し、2 番目のリファレンスでは、メソッド アクセスに対する JIT の利点について説明しています。
私が理解しているように、直接フィールドアクセスとローカルアクセスの類似点は次のとおりです(投稿に書いたようなローカルフィールドアクセスではありません-ローカルフィールドなどはありません)。
class foo {
int bar = 42;
int doStuff(){
int x = 1;
x += bar;
x += bar;
x += bar;
return x;
}
}
への各参照にbar
は、関連するパフォーマンス コストがあります。優れたコンパイラは、最適化の機会を認識し、コードを次のように「書き直します」。
int doStuff(){
int x = 1f;
int local_bar = bar;
x += local_bar;
x += local_bar;
x += local_bar;
return x;
}
JIT を使用しない場合、これは便利な最適化であり、パフォーマンスが20%向上します。
JIT を使用するbar
と、そもそもアクセスによるパフォーマンス ヒットが取り除かれるため、最適化は不要です。
2 番目のリファレンスでは、次のシナリオについて説明します。
class foo {
int bar = 42;
int getBar() { return bar; }
int doStuff(){
int x = 1;
x += getBar();
x += getBar();
x += getBar();
return x;
}
}
各関数呼び出しには、関連するパフォーマンス ペナルティがあります。コンパイラは複数のメソッド呼び出しをキャッシュできません(前の例でgetBar()
複数の直接フィールド アクセスをキャッシュしたように)。bar
ベースのコンポーネントをその戻り値に)。したがって、3 つのメソッド呼び出しを実行する必要があります。
上記の関数は、JIT の有無にかかわらずほぼ同じ速度で実行されることを理解することが重要です。
getBar()
上記の関数を単純に手動で置き換えるとbar
、パフォーマンスが向上します。JIT を使用しないマシンでは、フィールド アクセスが依然としてやや遅いため、そのパフォーマンス ブーストは約 3 倍になります。ただし、JIT を使用すると、フィールド アクセスが高速になるため、非常に遅いメソッドを高速フィールド アクセスに置き換えると、はるかに大きな (7 倍) ブーストが得られます。
それが理にかなっていることを願っています!