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

2018-03-29 15:03:37 +08:00
 Asimov01

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

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

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

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

4437 次点击
所在节点    Java
42 条回复
Asimov01
2018-03-29 17:10:50 +08:00
@sdpfoue 这倒是,不过我也不是纠结这个问题,只是突然想到,就抛出来讨论一下
Asimov01
2018-03-29 17:16:09 +08:00
@we2ex 从社会效率角度来讲,装配工确实不需要了解发动机原理,但从个人的角度来讲,这个装配工可能永远都只能做个装配工了,了不起是个高级装配工。求知欲是个体进步的动力。
zst
2018-03-29 17:26:13 +08:00
我还以为这种问题只会在 Mathematica 里面有
flowfire
2018-03-29 17:37:53 +08:00
@Asimov01 #19 长的好看
ppaapc
2018-03-29 18:07:54 +08:00
java 中肯定第二种吧 不然还得写个 return 跟效率是没啥关系
wfd0807
2018-03-29 18:17:52 +08:00
说第一种可读性高的,估计是没见过世面
我见过的
if (condition) {
dosomething
if (condition) {
dosomething
if (condition) {
dosomething
if (condition) {
dosomething
} else {
return
}
} else {
return
}
} else {
return
}
} else {
return
}
wfd0807
2018-03-29 18:18:12 +08:00
回帖不能 markdown 吗
misaka19000
2018-03-29 18:32:13 +08:00
对于 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-03-29 18:44:19 +08:00
短路判断法了解一下?

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

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

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

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

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

© 2021 V2EX