パフォーマンスへの影響の自動ボックス化
-
26-09-2019 - |
質問
通常のコンパイラ生成のコードを実行ボクシングやunboxing.がどのようなコンパイラの場合、boxed値はないか。この機能は、Oracle標準)コンパイラーの最適化ができます。
この方法:
public static void requireInRange(int index, Object[] array) {
if(index < 0 || index >= array.length)
throw new IndexOutOfBoundsException();
}
に関連する情報は、 array.length
, そうでなリンク先のホームページの内容にそれぞれの値の配列です。このコード:
int[] anArray = {3, 4, 2};
requireInRange(3, anArray);
のコンパイラを実際にコードを挿入したボクシングの各値の配列の?
解決
ありません自動ボックス化にコードです。実際、与え:
public static void requireInRange(int index, Object[] array) {
...
}
int[] anArray = {3, 4, 2};
requireInRange(3, anArray); // DOES NOT COMPILE!!!
ながら、 int
できautoboxedる Integer
, では、 int[]
は ない 車autoboxedる Integer[]
Java.き図書館機能のことが言語になることに変換します。
これは実際のソースの多くの混乱に関する例 Arrays.asList(anIntArray)
ている"破"での代わりに戻る List<Integer>
, 何が返されていることにつ要素 List<int[]>
.
しかし、実績を教えてください。??
お見積りから Java言語案内/自動ボックス化:
することは、適切ではありません使用自動ボックス化やunboxingのための科学計算、その他の性能-感度の数値コードです。An
Integer
の代替となるint
;自動ボックス化やunboxingブラーの区別はプリミティブ型と参照型を明らかにする排除します。
短きに、自動ボックス化が起こり、性能もかかり少します。ある種のことを助けを解消するなどのキャッシュ機構を組み込んでいます。※この理由は以下のように:
System.out.println(
((Integer) 0) == ((Integer) 0)
);
// true
System.out.println(
((Integer) 10000) == ((Integer) 10000)
);
// false (implementation-specific)
何が起こったことが 0
は 自動的に 弁当なし 新しい Integer
インスタンスは実際に作成された:値に一定の範囲 キャッシュ のための自動ボックス化を目的に、助けます。 10000
ほとんど実施しょうから落ちてしまうのがこの範囲が一のJVMの実装によってできる指定のキャッシュ範囲が必要です。
私が取得し配列の長さ!!!
多くの方法を容易にするために役立ちます requireInRange
あらゆるタイプの配列.残念なことJavaのプリミティブ配列にはしばしばいく反復するとのことですが、提供する過負荷のために int[]
, boolean[]
, byte[]
, Object[]
, など。
より簡潔なオプションを使用反射がそのサンノゼのホテルを表示およびロテインを開発した理由です。一般に、反映すべきでない方がほとんどのシナリオ.
とはいえ、 java.lang.reflect.Array
い int getLength(Object array)
static
できるメソッドの長さを返し 他の 配列に格納します。なtypesafeにとってより反射のメカニズム);通配列以外収集がスロー IllegalArgumentException
実行します。
に関する質問
- 管理性の高い繰り返しコード、文書Java -("触発"による
java.util.Arrays
)
他のヒント
ウィルコンパイラ、実際にコードを挿入 アレイの各値をボクシング用
int[]
はObject[]
パラメータを取るメソッドに渡すことができないので、コンパイラがコードを拒否します。
オートボクシングのみ個々のプリミティブ値について、決して全体のアレイについて起こる。
、あなたはコンパイラがコードを最適化しないと仮定することができます。一般的には、コードの逐語訳を行います。
youc疑いで想定した場合、また、JVMは、実行時にコードを最適化するのは非常に良い仕事をしていません。私はあなたはそれが問題である疑う(例えばプロファイラなど)正当な理由がない限り、それはどんな違いを前提としないだろう。