5

私は、Java にコンパイルする言語を作成するプロジェクトに取り組んでいます。私たちが使用しているフレームワーク (xtext) は、生成されたコードでボクシングを多用しています。具体的には、次のようなステートメントがある場合:

int i = 1;
int j = 2;
int k = i + j;

コンパイルされたコードは次のようになります。

IntegerExtensions.operator_plus(((Integer)i), ((Integer)j))

現在、私が取り組んでいるプロジェクトでは、特定の基本的な二項演算が非常に一般的になる特定の状況があります (特にインクリメントと比較)。

私の質問は、これはパフォーマンスの面で問題になるのでしょうか、それとも JIT (または同様にインテリジェントな JVM 機能) が単に何が起こっているのかを認識してすべてを修正するのでしょうか?

投稿する前に読んでください: 「気にしないで、読めるようにしてください」という回答を得ることには興味がありません。このコードは生成されたものであり、生成されたコードの読みやすさは気にしません。私が気にかけているのは、これによるパフォーマンスへの重大な影響を受けないことです。

ありがとう

4

4 に答える 4

4

これは実際に影響を与える可能性があります。へのキャストが発生すると、メソッドを使用Integerするように変換されます。このメソッドは、値がキャッシュ範囲 (-128 ~ 127) 内にあるかどうかを確認し、そうでない場合は作成しますintIntegerInteger.valueOf(int n)new Integer(n)

影響の量は多かれ少なかれ、自分でテストする必要があります。

于 2011-12-11T23:16:11.030 に答える
3

私の経験からのいくつかの観察:

  1. 一般に、ボクシングはアプリケーションのパフォーマンスを低下させますどれだけ目立つかは、実装されているアルゴリズムの性質によって異なります。修正する価値があるかどうか、どこに何かがあるかどうかは、プロファイラーと予想される費用対効果の比率だけが教えてくれます。

  2. 一般に、ボクシングはアプリケーションのメモリ使用量を増加させます私に関する限り、これは非常に重要です。おそらくパフォーマンスよりも重要です。

    Javaのintは、32 ビットの範囲で 4 ~ 8 バイト (JVM の実装によって異なります) のメモリを使用します。AnIntegerは 64 ビット システムで最大 20 ~ 24 バイトを使用しますが、それでも参照が必要です。メモリ要件が簡単に 4 倍 (x4) になる可能性がある大規模な配列を処理するアプリケーションの場合、またはさらに悪いことになります。

    この場合、ボクシングが「動く」か「動かない」かの違いを生む可能性があります。特定のコンピュータに搭載できるメモリは限られています。パフォーマンスは議論の対象にもなりませんが、メモリ不足のアプリケーションは一般的に遅くなります。

とは言うものの、オブジェクトに便利な利点がありますnull

于 2011-12-11T23:40:25.190 に答える
3

それがパフォーマンスの問題を引き起こすと言うことは、問題と呼ぶものに依存します。何を問題と呼ぶかは、おそらくコードが解決する問題の種類によって異なります。

この回答には、それを要約したセクションがあり、オートボクシング ガイドへのリンクも提供しています。

科学計算やその他のパフォーマンスが重要な数値コードにオートボクシングとアンボクシングを使用することは適切ではありません。

int/Integer オートボクシングに焦点を当てたベンチマークの具体例を次に示します。

簡単な質問: int/Integer 型のオートボクシングのコストはどれくらいですか?

簡単な答え: ボクシングあたり 15 ナノ秒。

于 2011-12-11T23:15:52.350 に答える
1

簡単に言えば、テストしてください。

簡単な例の 2 つのバージョンを作成し、所要時間を測定します。そうすれば、パフォーマンスの正確な違いと、余裕があるかどうかがわかります。

于 2011-12-11T23:15:58.187 に答える