0

私は C++ コードを翻訳していますが、typedef が多用されています。私はJavaでそれを行うことができないので、代わりに次のことを行います:

// C++
typedef unsigned int BucketKey; 


// Java
public class BucketKey {
    public int val;
}

私はJavaの専門家ではなく、実際にここに来たばかりで、intを直接使用する代わりにBucketKeyを使用するとどれくらい費用がかかるのだろうと思っていましたか?

念のために言っておきますが、少なくともあと 5 種類はこれを行う必要があります。

ありがとう

4

6 に答える 6

2

特に配列がある場合は、大きなオーバーヘッドが追加されます。比較するテスト プログラムを作成することをお勧めします。

Javaint[100]では、C/C++ に似た 100 個の int を持つ配列を作成するInteger[100]YourObjectContainingAnIntMember[100]、100 個の異なるオブジェクトへの 100 個の参照 (ポインター) を持つ配列を作成します。

言うまでもなく、BucketKeyオブジェクトには参照セマンティクスがintありますが、C++ のような値セマンティクスがあります。

BucketKey x = new BucketKey(100);
BucketKey y = x
y.value = 200; // x will change as well

int x = 100;
int y = x;
y = 200; // x will remain 100

C++ の typedef も新しい型を作成しないことも付け加えておく価値があります。したがって、BucketKey変数の型は単純に int ですが、Java にはintそれ以上の方法を呼び出すための typedef がありません。異なるタイプの C++ ソリューションは次のようになります。

struct BucketKey {
    value x;
}
于 2013-01-14T20:23:15.307 に答える
1

あなたの質問はボクシングとは何の関係もないことに注意してください.Javaintはプリミティブ型であり、そのボックス化されたバージョンはjava.lang.Integer. クラスメンバーへのアクセスがプリミティブ変数へのアクセスよりも遅いかどうか疑問に思っています。ほとんどの Java パフォーマンスに関する質問には、基本的に答えがありません。違いはありますが、その違いは次のような多くの要因に依存します。

  • ハードウェア アーキテクチャ
  • Java バージョン
  • オペレーティング·システム

ただし、高頻度の取引を行っていない限り、カプセル化を考慮してプログラムを正しく構成すれば、生産性の大幅な向上と比較して、パフォーマンスへの影響は完全に許容できるマイナス面になります。


このようなパフォーマンスの問題が本当にあり、JVM での作業を検討している場合は、Java よりも最新のプログラミング言語に目を向けるべきです。

実際のところ、JVM は Value クラスをサポートしていません。ただし、Scala には次の機能があります。

http://docs.scala-lang.org/overviews/core/value-classes.html

于 2013-01-14T20:23:43.223 に答える
1

可能であれば、プリミティブ int を使用してください。ボックス化/ボックス化解除のペナルティは高くありませんが、これをベンチマークして確認する必要があります。いずれにせよ、あなたの例ではボックス化/ボックス化解除しているようには見えません。プリミティブとオブジェクトの決定を下しています。

いずれにせよ、リアルタイム システムなどを作成する場合を除き、これについてはあまり心配する必要はありません。

ピーター・ローリーに同意します。ビジュアル vm を使用してボトルネックを特定します。これについても短いチュートリアルを書きました[source]

于 2013-01-14T20:27:24.130 に答える
1

それがもたらす違いは、それをどれだけ使用しているかによって異なります。1秒間に100万回使用している場合。大した違いはありません。1 秒間に 1000 万回使用している場合は、それに気付くでしょう。1 秒間に 1 億回使用している場合、プリミティブは何倍も高速になります。

シンプルで明確な作業プログラムを作成してから、(VisualVM などを使用して) プロファイラーを実行してボトルネックを見つける必要があります。予測していなかったところにボトルネックが発生する可能性が高くなります。

于 2013-01-14T20:30:06.963 に答える
0

少しオーバーヘッドのボクシングとアンボクシングの値があります。そうは言っても、オーバーヘッドは通常、「典型的な」プログラムの残りの処理と比較して無視できます。

最悪のケース (キー アクセス数の観点から) のユース ケースでテストを作成し、柔軟なキー タイプを使用する価値がある場合は、両方の方法でパフォーマンスを測定することをお勧めします。

実際問題としてキーの型を柔軟に変更する必要がない場合は、intを使用してください。

于 2013-01-14T20:20:46.123 に答える
0

ボクシング クラスを使用するには、正当な要件があります。

たとえば、引数でプリミティブではなくボックスを使用すると、引数が null の場合、JAX-B は XML 要素に属性を含めることを回避できます。防ぐということです

<employee name='Henry' id=null years=null />

しかし、どちらであるべきか

<employee name='Henry' />

したがって、そのような要件が発生した場合は、ボックス化されたインスタンスを使用することもできます。

私は Java コンパイラの専門知識はありませんが、コンパイラが最適化を処理してくれることを期待しています。私の精神実験は、それが予想された比較的単純な最適化であると言っているようです。

私の考えでは、Java コンパイラがとにかくボックス化を最適化するという条件で、ある時点でボックス化されたインスタンスをインスタンス化する必要があるということです。早めに始めて、すべての機能と設備を楽しんでみませんか?

于 2013-01-14T20:42:35.923 に答える