Что лучше с точки зрения производительности, неявной (автоматической) распаковки или явной распаковки?
Чтобы поместить это в код - который имеет лучшую производительность (если есть разница вообще)?
Учитывая это:
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 во время выполнения, и если в любом случае это одни и те же байт-коды, нет причин ожидать разницы в производительности.
Это просто привкус преждевременной оптимизации, но если вы думаете, что можете найти разницу во времени: сделайте это с помощью тщательного тестирования, а затем поймите, что оно может отличаться в разных точечных выпусках, операционных системах и т. Д. Это просто не однозначный выигрыш в любом случае.