35

パフォーマンスと効率的なメモリ使用量の点で優れているのは次のうちどれですか?

Boolean isItTrue(arg){ 
    return Boolean.TRUE;
}

boolean isItTrue(arg){
    return Boolean.TRUE
}

Boolean isItTrue(arg){
    return true;
}

boolean isItTrue(arg){
    return true;
}

プリミティブ型を使用する方が高速で簡単なはずですが、一方で、静的オブジェクトへの参照を使用する場合、新しい値は作成されません。それとも、コンパイラレベルで最適化されておりtruefalseメモリを節約するために静的オブジェクトへの参照に置き換えられていますか?

4

9 に答える 9

31

第一に、他のものよりもいずれかを使用することのパフォーマンス上の利点は、関連するには小さすぎる可能性が最も高いです。コードの単純さ/読みやすさ/保守性ははるかに重要です...ほとんどの場合。


いずれの例にも、Booleanインスタンスの作成は含まれていません。

Boolean理論的には、4つのうち3つがクラスの初期化をトリガーする可能性があり、アプリケーションがそれを行わなかった可能性があります。その可能性が非常に低いイベントでは、アプリケーション全体で、他の方法では割り当てられなかった2つのオブジェクトが割り当てられます。初期化にはおそらく数マイクロ秒かかり、長期的には数バイトのRAM(50未満)を消費します。


これは、レジスタをゼロに設定するだけなので、他のすべてと同等かそれよりも高速になります。

boolean isItTrue(arg){
    return true;
}

単独で考えると、これはレジスタをゼロにするのではなく、メモリから静的参照をロードする必要があります。ただし、状況によっては、JITコンパイラーがこれを最適化できる場合があります。

Boolean isItTrue(arg){ 
    return Boolean.TRUE;
}

表面的には、これにはBoolean.valueOf(true)「ボックス」への呼び出しが含まれますtrueが、JITコンパイラーは、呼び出しをインライン化することにより、前のコードと同じコードに最適化できるはずです。

Boolean isItTrue(arg){
    return true;
}

表面的には、これには、のBoolean.booleanValue(Boolean.TRUE)「ボックス化解除」への呼び出しが含まれBooleanます。この呼び出しはインライン化できます。BooleanJITコンパイラーが、オブジェクトへの参照のロードとその値フィールドのフェッチを回避できる可能性もあります。

boolean isItTrue(arg){
    return Boolean.TRUE
}

結論として、4つの選択肢の相対的なパフォーマンスは、JITコンパイラーが最適化にどれだけ成功するかによって異なります。これは、コンテキスト、JITコンパイラの詳細、JVM設定などによって異なります。最良の場合、JITコンパイラーは(少なくとも理論的には)それらすべてに対して同じ(最適な)コードを生成できます。

于 2011-08-02T12:11:17.510 に答える
13

パフォーマンスの向上がある場合、それは無関係であるほどごくわずかです。Boolean.TRUEおよびBoolean.FALSEは、どのような場合でも新しいオブジェクトを返しません。

于 2011-08-02T11:52:48.310 に答える
12

このようなマイクロ最適化よりも、コードメンテナの明確さを優先してください。問題は「どちらが小さい/速いか」ではなく、最初にあなたが何を意味するかを表現します。

メソッドがブールオブジェクトを返す場合、受け取る人は誰でも、それがnullである可能性があるかどうか、およびnullである場合は、「わからない」など、true/falseとは異なる何かを意味する可能性があるかどうかを判断する必要があります。

したがって、ブール値のタイプを返します。それが意味する場合は、それ以外の場合は、Nullを許可し、次にブール値を許可します。

ブール値を返す場合は、

return true; // or false

パフォーマンスだけでなく明確さのためにも、オートボクシングに頼るよりも優れている必要があります。

ブール値を返す場合は、

return Boolean.TRUE

私がマイクロ最適化に反対しているのと同じように、それは余分なゴミを作成することを回避するだけです。リターンタイプとのマッチングが目立つという点でも明確だと思います。

于 2011-08-02T11:58:19.840 に答える
7

彼らははるかに速くなります。この2つに違いはないと思います。

Boolean isItTrue(arg){ 
    return Boolean.TRUE;
}

boolean isItTrue(arg){
    return true;
}

ただし、他の実装では、バックエンドでのボックス化とボックス化解除にプロセッサの時間がかかるため、処理が遅くなります。


編集

私は4つの異なる方法を実装することによっていくつかの事実を収集しました。ただそれをあなたと共有したいのですが、それを書く方法なら私はしません。

Boolean isItTrue(){ 
    return Boolean.TRUE;
}

Free Memory before start --> 16030936
Time taken in Secs --> 7.844
Free Memory After Process --> 15940472
Memory Usage --> 90464

boolean isItTrue(){
    return Boolean.TRUE;
}

Free Memory before start --> 16030936
Time taken in Secs --> 10.109
Free Memory After Process --> 15940472
Memory Usage --> 90464

Boolean isItTrue(){
    return true;
}

Free Memory before start --> 16030936
Time taken in Secs --> 7.906
Free Memory After Process --> 15940472
Memory Usage --> 90464

boolean isItTrue(){
    return true;
}

Free Memory before start --> 16030936
Time taken in Secs --> 7.828
Free Memory After Process --> 15940472
Memory Usage --> 90464

メインクラス

public static void main(String[] args){
    NewClass n = new NewClass();

    long sysTime = System.currentTimeMillis();

    Runtime rt = Runtime.getRuntime();
    long freeMem = rt.freeMemory();
    System.out.println( "Free Memory before start --> " + freeMem );
    for( int i = 0; i < Integer.MAX_VALUE; i++ ){
        n.isItTrue();
    }
    System.out.println( "Time taken in Secs --> " + (System.currentTimeMillis() - sysTime)/1000D);
    System.out.println( "Free Memory After Process --> " + rt.freeMemory() );
    System.out.println( "Memory Usage --> " + ( freeMem - rt.freeMemory() ) );
}
于 2011-08-02T11:54:16.690 に答える
4

最後のもの

boolean isItTrue(arg){
    return true;
}

Booleanメソッドが時々戻る必要がある場合にのみ使用しますnull

于 2011-08-02T11:52:34.380 に答える
3

私の経験則は次のとおりです。

  1. デフォルトの選択はプリミティブ型(boolean)です。
  2. null可能性が必要な場合、または値をコンテナーに格納する必要がある場合は、クラス(Boolean)を使用します。

これを念頭に置いて、私のデフォルトの選択は次のようになります。

boolean isItTrue(arg){
    return true;
}

パフォーマンスに関する限り、確かに思われる唯一のことは、を使用するよりも使用する方Boolean速いbooleanシナリオを想像するのは難しいということです。それが遅くなるか同じになるかは多くのことに依存し、一般的に答えることは不可能です。

これが本当に気になる場合は、重要な場所でコードのプロファイルを作成してください。

于 2011-08-02T11:53:06.383 に答える
2

その論理により、静的オブジェクト自体への参照は、真理値と同じくらいコストがかかります。

オブジェクトの使用はプリミティブよりも多少遅いかもしれませんが、心配する必要はありません。違いは関係ありません。

于 2011-08-02T11:53:42.513 に答える
2

最後のものを使用します(ちょうどboolean)。コンパイラーがそれらすべてを同じものに最適化したとしても、少なくともコンパイラーの仕事を簡単にしていることになります(あなたが知っている簡単な仕事ではありません!)。

さらに、キーストロークが少なくなります(Shiftキーを押す必要はありません)。しかし、実際には、ラッパークラスを使用する必要がある唯一の理由は、ラッパークラスをに設定する機能が必要な場合null、およびのような一般的なデータ構造で使用する場合LinkedList<E>です。

于 2011-08-02T11:56:04.943 に答える
0

java.lang.Booleanは16バイトかかります。

これは、パフォーマンスとメモリサイズの問題のみを探している場合の方法です。

boolean isItTrue(arg){
    return true;
}
于 2011-08-02T11:53:38.437 に答える