Java 中三元和 if else 哪个的效率比较高,有底层解释吗,谢谢了!

2018-12-28 17:11:26 +08:00
 Genokiller
1840 次点击
所在节点    问与答
7 条回复
yrom
2018-12-28 17:24:50 +08:00
给你个思路,javap 看一下两者编译后的字节码有何不同
naix1573
2018-12-28 17:29:42 +08:00
三元的效率更高吧
Genokiller
2018-12-28 17:46:28 +08:00
@yrom 我看到有人编译过了,if else 就多了一条 astore 指令,应该是没有影响的
IsaacYoung
2018-12-28 17:47:08 +08:00
我猜一样都是 jmp?🌹🐔
shintendo
2018-12-28 17:51:49 +08:00
三元总可以转换为等价的 if else 吧,所以如果 if else 效率更高,编译器为什么不做这个转换来优化呢
Genokiller
2018-12-28 18:16:11 +08:00
是否还有其他影响效率的地方


两段简短的测试代码:

Test2.java (三元运算符)
public class Test2
{
public static void main(String args[])
{
int m =1, n=2;
String s = m > n ? "a" : "b";
}
}



Test3.java ( if...else...)
public class Test3
{
public static void main(String args[])
{
int m = 1, n = 2;
if(m > n) {
String s = "a";
}
else {
String s = "b";
}
}
}



编译后用 javap 反编译得到下面指令码:

Compiled from "Test2.java"
public class Test2 extends java.lang.Object{
public Test2();
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: istore_1
2: iconst_2
3: istore_2
4: iload_1 <-- 变量表索引 1 处的值压入堆栈,即 m 的值 1
5: iload_2 <-- 变量表索引 2 处的值压入堆栈,即 n 的值 2
6: if_icmple 14 <-- 比较上面两个值,若 true 继续,否则跳转到 14
9: ldc #2; //String a <-- load constant,将"a"压入堆栈
11: goto 16
14: ldc #3; //String b <-- 将"b"压入堆栈
16: astore_3 <-- 从堆栈弹出值,存储到变量表索引 3 处
17: return

}

----------------------------------------

Compiled from "Test3.java"
public class Test3 extends java.lang.Object{
public Test3();
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: istore_1
2: iconst_2
3: istore_2
4: iload_1
5: iload_2
6: if_icmple 15
9: ldc #2; //String a
11: astore_3
12: goto 18
15: ldc #3; //String b
17: astore_3
18: return

}
---------------------
作者:crazygou
来源:CSDN
原文: https://blog.csdn.net/CrazyGou/article/details/1655593
版权声明:本文为博主原创文章,转载请附上博文链接!
mxalbert1996
2018-12-28 23:04:04 +08:00
人生三大错觉:我比写编译器的人聪明

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/521969

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX