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);
    }
}
4

4 に答える 4

14

それらの間に違いはありません。バイトコードで確認できます。

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

実行javapして、コンパイル結果を確認します。

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 (明示的) と同じです。

于 2011-08-02T17:48:56.360 に答える
8

自動アンボックス化は単なる構文上の糖衣であるため、違いはすべてコンパイル時にあるはずです。この場合、生成されるJavaバイトコードはまったく同じである必要があります。これは、実行時に違いがないことを意味します。ただし、より一般的なケースでは、明示的なアンボックス化の方が高速な場合があります。これは、暗黙的なアンボックス化によって値が複数回アンボックス化される可能性があるためです。明示的なアンボックス化では、値が1回だけアンボックス化され、結果が保存されることを保証できます。

于 2011-08-02T17:17:06.023 に答える
3

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

人間が書いた手法は最適ではない可能性があるため、人間が書いた貧弱なオートボクシングの方法を実行すると、パフォーマンスが低下する可能性があります。しかし、本当にそれに到達したい場合は、人間がデフォルトのパフォーマンスを上回るある種の非一般的なソリューションを作成する可能性が等しくあります。このようなソリューションは柔軟ではなく、おそらく計算の複雑さとメモリのトレードオフになります (大きなルックアップ配列など)。

個人的には、もう少し時間をかけて全体像を実際に見ることをお勧めします。1 行または 2 行のコードを最適化しても、良い投資になることはほとんどありません。プログラム全体で必要な作業量を減らすと、パフォーマンスが向上する可能性が高くなります。

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

これは時期尚早の最適化に過ぎませんが、時間の違いを見つけることができると思われる場合は、慎重にテストしてから、異なるポイントリリース、オペレーティングシステムなどで異なる可能性があることを理解してください.それは明確な勝利ではありません.いかなる場合でも。

于 2011-08-02T17:20:40.060 に答える
0

VIP は VIBooleanの代わりに返さなければならないのbooleanでしょうか?

于 2011-08-02T18:32:58.567 に答える