Ron*_*onK 1 java performance unboxing
把它放在代码中 - 性能更好(如果有差异的话)?
鉴于这种:
public class Customer
{
....
public Boolean isVIP(){...}
...
}
Run Code Online (Sandbox Code Playgroud)
哪个更快?
public void handleCustomer(Customer customer)
{
if (customer.isVIP()) // Auto Unboxing
{
handleNow(customer);
}
else
{
sayHandlingNowButQueueForTomorrow(customer);
}
}
Run Code Online (Sandbox Code Playgroud)
或这个:
public void handleCustomer(Customer customer)
{
if (customer.isVIP().booleanValue()) // Explicit unboxing
{
handleNow(customer);
}
else
{
sayHandlingNowButQueueForTomorrow(customer);
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*k D 14
它们之间没有区别,您可以在字节码中验证它:
public class ImplicitTest {
public static void main(String[] args) {
Boolean b = true;
boolean i = b;
boolean e = b.booleanValue();
}
}
Run Code Online (Sandbox Code Playgroud)
运行javap以查看它编译的内容:
javap -c ImplicitTest
Run Code Online (Sandbox Code Playgroud)
这是输出:
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
}
Run Code Online (Sandbox Code Playgroud)
如您所见 - 第5,6,9行(隐式)与10,11,14(显式)相同.
差异应该都在编译时,因为自动拆箱只是语法糖.在这种情况下,生成的Java字节码应该完全相同.这意味着在运行时没有区别.但是,在更一般的情况下,显式拆箱可能会更快,因为隐式拆箱可能会多次取消打包值,而使用显式取消装箱,您可以保证该值仅取消装箱一次并存储结果.
| 归档时间: |
|
| 查看次数: |
1407 次 |
| 最近记录: |