2011-08-02 5 views
1

これをコードに入れると、パフォーマンスが向上します(違いがある場合)。パフォーマンス、暗黙的(自動)のアンボックス化または明示的なアンボックス化のどちらが優れていますか?

public class Customer 
{ 
    .... 

    public Boolean isVIP(){...} 
    ... 
} 

速いですどちら:

はこれを考えると?

public void handleCustomer(Customer customer) 
{ 
    if (customer.isVIP()) // Auto Unboxing 
    { 
     handleNow(customer); 
    } 
    else 
    { 
     sayHandlingNowButQueueForTomorrow(customer); 
    } 
} 

またはこの:オートアンボクシングは単なる糖衣構文であるため、

public void handleCustomer(Customer customer) 
{ 
    if (customer.isVIP().booleanValue()) // Explicit unboxing 
    { 
     handleNow(customer); 
    } 
    else 
    { 
     sayHandlingNowButQueueForTomorrow(customer); 
    } 
} 
+0

私はあなたが '暗黙の"意味を持っていると思います。*明示的* –

+0

@matt - 10x、私は質問を更新しました – RonK

答えて

10

それらの間の違いはありません、あなたはバイトコードで確認できます。これはにコンパイル

public class ImplicitTest { 
    public static void main(String[] args) { 
     Boolean b = true; 
     boolean i = b; 
     boolean e = b.booleanValue(); 
    } 
} 

:あなたが見ることができるように

てjavap -c ImplicitTest

Compiled from "ImplicitTest.java" 
public class ImplicitTest extends java.lang.Object{ 
public ImplicitTest(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public static void main(java.lang.String[]); 
    Code: 
    0: iconst_1 
    1: invokestatic #2; //Method java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean; 
    4: astore_1 
    5: aload_1 
    6: invokevirtual #3; //Method java/lang/Boolean.booleanValue:()Z 
    9: istore_2 
    10: aload_1 
    11: invokevirtual #3; //Method java/lang/Boolean.booleanValue:()Z 
    14: istore_3 
    15: return 

} 

- ライン5を、 6,9(暗黙的)は10,11,14(明示的)と同じです。

7

違いはすべて、コンパイル時にする必要があります。この場合、生成されるJavaバイトコードはまったく同じである必要があります。これは実行時に違いがないことを意味します。しかし、より一般的なケースでは、明示的なアンボックスは明示的なアンボックスでは一度しかアンボックスされず、結果が格納されることを保証することができますが、暗黙的なアンボックスは値を複数回unboxすることができるのでより高速です。

+0

あなたは自分自身を繰り返す自動ボックス解除の可能性について正しいです - 幸運にも、私の場合ではありません。 – RonK

+0

このアンサーは、受け入れられたものよりも優れています。なぜなら、一例を超えて、一般にアンボックスがどのように機能するかを一般化するのに役立つ原則が述べられているからです。 – LarsH

3

パフォーマンス上、理想的には同じである必要があります。

人間の書かれたテクニックは、あまり最適ではない可能性があるので、人間が書かれたautoboxingの方法が悪いと、パフォーマンスが低下する可能性があります。しかし、実際にそれに到達したいのであれば、人間がデフォルト性能を上回る非一般的な解決策を書く可能性は同じです。そのようなソリューションは柔軟性がなく、メモリの計算上の複雑さ(おそらく大きな検索配列のような)を犠牲にするでしょう。

個人的には、実際に大きな画像を表示するには時間をかけてください。 1行または2つのコードを最適化することは、決して良い投資ではありません。プログラム全体で必要な作業量を減らすことは、パフォーマンスを向上させる可能性が高くなります。

一般的なケースでは、JVMはオートボックスの導入によって変更されていないことに注意してください。したがって、コンパイラは、最も一般的な場合に手動で書き出すのと同じ命令を追加しています。パフォーマンスは実行時のJVMの測定値です。どちらの方法でも同じバイトコードであれば、パフォーマンスの違いを期待する理由はありません。

これは時期尚早の最適化が必要な場合がありますが、時間の差があると思われる場合は注意深いテストを行い、異なるリリースやオペレーティングシステムなどで異なる可能性があることを認識してください。いずれにしてもクリアな勝利。

+0

この1行でパフォーマンス上の問題が解決すると思うので、私はこれを求めていません。Java 1.4用に書かれたコードの結果である、コードベースに '.booleanValue()'が埋め込まれていることがわかりました。暗黙的なアンボックス化に切り替えることで、アプリケーション全体でパフォーマンスが低下しないようにしたいと思っていました。 – RonK

+0

手作業でコードを記述している場合は、オートボクシングに頼らないことをお勧めします。基本的に、コンパイラは "。BooleanValue()"を目に見えない形で追加します。私は「目に見えない」コードのファンではない。この場合、コンパイラが自動的にStringBuilderの構築に追加する方法の一種であり、 "String" + "String" + "String"ルーチンを処理するために1トンの追加を行います。おそらくそれは少し過激ですが、私はコンストラクタ内で 'super()'への明示的な呼び出しを追加する傾向があります。言い換えれば、それは6人から1人、または他の人から半ダースです。 –

0

booleanの代わりにBooleanを返す必要があるVIPですか?

+0

残念ながらはい...(VIPは単なる例でしたが、数十ものものがあります...) – RonK

関連する問題