Что лучше с точки зрения производительности, неявной (автоматической) распаковки или явной распаковки? - PullRequest
1 голос
/ 02 августа 2011

Поместить это в код - какая производительность лучше (если вообще есть разница)?

Учитывая это:

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 ]

12 голосов
/ 02 августа 2011

Нет никакой разницы между ними, вы можете проверить это в байт-коде:

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 (явные).

8 голосов
/ 02 августа 2011

Разница должна быть во время компиляции, поскольку автоматическая распаковка - это просто синтаксический сахар. В этом случае сгенерированный байт-код Java должен быть точно таким же. Это означает, что нет никакой разницы во время выполнения. Однако в более общем случае явная распаковка может быть быстрее, поскольку неявная распаковка может распаковывать значение более одного раза, а при явной распаковке вы можете гарантировать, что значение будет распаковано только один раз, а результат сохранен.

3 голосов
/ 02 августа 2011

С точки зрения производительности, в идеале они должны быть одинаковыми.

Существует вероятность того, что методы, написанные человеком, будут немного менее оптимальными, поэтому это может привести к снижению производительности, если вы будете использовать плохие, написанные человеком методы автобоксирования.Но, если вы действительно хотите достичь этого, есть равный шанс, что человек может написать какое-то необщее решение, которое превосходит производительность по умолчанию.Такое решение не будет таким гибким, и оно, вероятно, будет компенсировать вычислительную сложность памяти (например, большой массив поиска).

Лично я бы порекомендовал потратить некоторое время, чтобы реально рассмотреть увеличенное изображение.Оптимизация одной или двух строк кода почти никогда не является хорошей инвестицией.Сокращение объема работы, необходимой во всей программе, с большей вероятностью повысит вашу производительность.

Обратите внимание, что в общем случае JVM не изменилась с введением автобоксирования, как это сделал компилятор.Таким образом, компилятор добавляет те же инструкции, которые вы выписываете вручную, в наиболее распространенных случаях.Производительность измеряется в JVM во время выполнения, и если в любом случае это одни и те же байт-коды, то нет причин ожидать разницы в производительности.

Это просто привкус преждевременной оптимизации, но если вы думаете, что можете найти разницувовремя: сделайте это с тщательным тестированием, а затем поймите, что оно может отличаться в разных точечных выпусках, операционных системах и т. д. В любом случае это не однозначный выигрыш.

0 голосов
/ 02 августа 2011

Является ли VIP таким VI, что он должен вернуть Boolean вместо boolean?

...