D18*_*180 5 java optimization performance benchmarking
每次我必须转换int成String我选择的一个""+a或Integer.toString(a).现在我想知道哪种方式更快,所以我编写了一个简单的基准测试,调用function_1,function_2和function_3 10000000次并打印处理函数所需的时间.以下是功能:
public static String i="";
public static String j="";
public static String k="";
public static void function_1()
{
i=Integer.toString(getOne());
}
public static void function_2()
{
j=""+1;
}
public static void function_3()
{
j=""+getOne();
}
public static int getOne()
{
return 1;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Benchmarking starting...
Executing function_1 10000000 time(s)...
Done executing function_1 in 476 ms.
Executing function_2 10000000 time(s)...
Done executing function_2 in 8 ms.
Executing function_3 10000000 time(s)...
Done executing function_3 in 634 ms.
Benchmarking complete!
Run Code Online (Sandbox Code Playgroud)
我认为function_2是如此之快,因为它被编译为
public static void function_2()
{
j="1";
}
Run Code Online (Sandbox Code Playgroud)
所以为了避免这种情况,我改用了这个功能getOne().但这里是有趣的部分(对我而言):function_3必须在不使用原始toString方法的Object情况下编译(在这种情况下Integer.toString(1)因为int是原始的).我的问题是:编译器如何实际威胁,""+1所以它比调用慢Integer.toString(1)?
""并且1在编译时已知。这就是为什么 infunction_2 "" + 1真的被"1"while 转换为字节码所取代。
getOne()结果在编译时未知,因此连接将在运行时完成。但是因为连接 (+) 效率不高,编译器很可能会将其更改为StringBuilder.append()基于实现的实现。
不相信我?尝试:javap -c ClassName.class你会看到这样的:
public static void function_2();
Code:
0: ldc #39 // String 1
2: putstatic #16 // Field j:Ljava/lang/String;
5: return
public static void function_3();
Code:
0: new #42 // class java/lang/StringBuilder
3: dup
4: invokespecial #44 // Method java/lang/StringBuilder."<init>":()V
7: invokestatic #28 // Method getOne:()I
10: invokevirtual #45 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
13: invokevirtual #49 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
16: putstatic #16 // Field j:Ljava/lang/String;
19: return
Run Code Online (Sandbox Code Playgroud)
function_2() 只有一个字符串“1”,而 function_3 有所有这些方法调用,里面有额外的 StringBuilder :)
请记住,运行时可能会发生一些优化,但这种行为是 JVM 并且依赖于配置。
| 归档时间: |
|
| 查看次数: |
5967 次 |
| 最近记录: |