探讨一下 [if..else] 语句在 Java 和 JavaScrip 中的效率问题

2018 年 3 月 29 日
 CyberZCS

突然想到一个问题,在 Java 中

if(a > 1){
    return 2;
}else {
    return 0;
}

和

if(a > 1){
    return 2;
}
retrun 0;

这两种写法最终的效果是一样的,那么效率也是一样的吗?
在 JavaScript 中呢?

5867 次点击
所在节点    Java
42 条回复
CyberZCS
2018 年 3 月 29 日
@sdpfoue 这倒是,不过我也不是纠结这个问题,只是突然想到,就抛出来讨论一下
CyberZCS
2018 年 3 月 29 日
@we2ex 从社会效率角度来讲,装配工确实不需要了解发动机原理,但从个人的角度来讲,这个装配工可能永远都只能做个装配工了,了不起是个高级装配工。求知欲是个体进步的动力。
angles6645
2018 年 3 月 29 日
我还以为这种问题只会在 Mathematica 里面有
flowfire
2018 年 3 月 29 日
@Asimov01 #19 长的好看
ppaapc
2018 年 3 月 29 日
java 中肯定第二种吧 不然还得写个 return 跟效率是没啥关系
wfd0807
2018 年 3 月 29 日
说第一种可读性高的,估计是没见过世面
我见过的
if (condition) {
dosomething
if (condition) {
dosomething
if (condition) {
dosomething
if (condition) {
dosomething
} else {
return
}
} else {
return
}
} else {
return
}
} else {
return
}
wfd0807
2018 年 3 月 29 日
回帖不能 markdown 吗
misaka19000
2018 年 3 月 29 日
对于 Java8 来说是一样的,因为编译后的字节码完全一样:
```
public int test();
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iconst_1
4: if_icmple 9
7: iconst_2
8: ireturn
9: iconst_0
10: ireturn

public int test();
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iconst_1
4: if_icmple 9
7: iconst_2
8: ireturn
9: iconst_0
10: ireturn
```
zn
2018 年 3 月 29 日
短路判断法了解一下?

```
bool processData(int arg1, string arg2, int arg3, SomeObject arg4, ....) {

if( arg1 < 0 ) {
return false;
}
if( isValid(arg2) ) {
return false;
}
if( arg3 > 99 ) {
return false;
}
if( arg4 == null ) {
return false;
}

...

processArg1(arg1);
processArg2(arg2);

...

return true;
}
```
aa6563679
2018 年 3 月 29 日
这种小细节没必要在意的,因为编译时编译器会优化,运行时还有 jit 再优化,最终代码不知道变成什么样了
aristotll
2018 年 3 月 29 日
我反而喜欢用三目表达式 ...
iyangyuan
2018 年 3 月 29 日
第二种优于第一种,没什么可讨论的
kisnows
2018 年 3 月 29 日
@wfd0807 #26 像你说的这种的话,直接 else 条件判断玩 return 掉,其他的依然有 if 就有 else
CyberZCS
2018 年 3 月 29 日
@misaka19000 这就是我想要的东西,用事实说话😉
q397064399
2018 年 3 月 29 日
@Asimov01 #34 效率在运行时也是不一样的,,了解下 分支预测 跟 指令冒险 还有内存屏障,你就知道 这个代码 在不同场景下 性能是完全两回事了
loveCoding
2018 年 3 月 29 日
提前判断,提前返回,增加可读性
Justin13
2018 年 3 月 29 日
喜欢第二种,大括号能省就省,最好是
return (a > 1 ? 2 : 0)
aleung
2018 年 3 月 29 日
为什么不自己测试一下呢? js 可以用 jsperf.com
zone53
2018 年 3 月 29 日
一般来说,函数出口只留一个是最好的吧,所以返回一个变量比较好。
CyberZCS
2018 年 3 月 29 日
@q397064399 多谢指教,我去了解了解

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

https://v2ex.ih06.com/t/442506

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

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

© 2021 V2EX