Что лучше с точки зрения производительности, неявной (автоматической) распаковки или явной распаковки?

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

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

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 ответа

Решение

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам