突然想到一个问题,在 Java 中
if(a > 1){ return 2; }else { return 0; } 和
if(a > 1){ return 2; } retrun 0; 这两种写法最终的效果是一样的,那么效率也是一样的吗?
在 Javascript 中呢?

突然想到一个问题,在 Java 中
if(a > 1){ return 2; }else { return 0; } 和
if(a > 1){ return 2; } retrun 0; 这两种写法最终的效果是一样的,那么效率也是一样的吗?
在 Javascript 中呢?
1 airport0930 Mar 29, 2018 今晚吃什么? |
2 zhlssg Mar 29, 2018 ......一般来说,优先选择第二种。但是肯定不是出于考量效率的角度 |
&nbs; 3 zwx327634 Mar 29, 2018 我的习惯是,每个 if,都要有个 else 结尾,可读性强,业务上也减少遗漏问题。代码审查会度量 if 里的条件数量,else 不知道 |
4 shintendo Mar 29, 2018 如果两种写法是等价的,而写法 A 效率更高,那编译器为什么不把写法 B 自动优化成写法 A 呢 |
5 we2ex Mar 29, 2018 via Android 分支预测 了解一下 |
7 araraloren Mar 29, 2018 Your question is too simple! |
9 sdpfoue Mar 29, 2018 影响效率的地方千千万 唯独不需要考虑你提的这种东西 |
10 learnshare Mar 29, 2018 编译器会考虑这些问题,并不是写代码的时候该操的心 |
11 jmc891205 Mar 29, 2018 Java 和 Javascript 我不知道 但是在 C++里编译器会把他们优化成同样的东西 |
12 mokeyjay Mar 29, 2018 js 的话,理论上第二种性能高一点吧 但这根本就能忽略不计,毫无意义 |
13 zhlssg Mar 29, 2018 @boywang004 好吧,我是写 js 的,airbnb 的 eslint 约束规则是必须用第二种 |
14 autoxbc Mar 29, 2018 用 node 跑了一下,没有区别 习惯上用第二种;多个特例的话,第一种会出魔鬼三角 |
15 flowfire Mar 29, 2018 卫语句了解一下 |
16 yejinmo Mar 29, 2018 大括号不换行影响性能 |
17 xuhaoyangx Mar 29, 2018 可读性 1 好 |
18 Asimov01 OP 我的习惯是第一种写法,但是看到别人的代码里面有很多第二种写法,个人感觉可读性和维护性是不如第一种写法的。 所以就突然想到这个问题,这两种写法除了可读性方面的差别,那么在执行效率上会不会有什么差别呢? 也并不是纠结这个问题,所以说是探讨一下。 但是如果想劝公司里其他人也改用第一种写法(保持公司代码风格一致性),除了可读、可维护性更好,如果效率也更高,那么理由也就更充分一些。 |
20 sw0rd3n Mar 29, 2018 via iPhone 编译器会优化的,两种写法等价 |
22 Asimov01 OP @we2ex 从社会效率角度来讲,装配工确实不需要了解发动机原理,但从个人的角度来讲,这个装配工可能永远都只能做个装配工了,了不起是个高级装配工。求知欲是个体进步的动力。 |
23 zst Mar 29, 2018 via Android 我还以为这种问题只会在 Mathematica 里面有 |
25 ppaapc Mar 29, 2018 java 中肯定第二种吧 不然还得写个 return 跟效率是没啥关系 |
26 wfd0807 Mar 29, 2018 说第一种可读性高的,估计是没见过世面 我见过的 if (condition) { dosomething if (condition) { dosomething if (condition) { dosomething if (condition) { dosomething } else { return } } else { return } } else { return } } else { return } |
27 wfd0807 Mar 29, 2018 回帖不能 markdown 吗 |
28 misaka19000 Mar 29, 2018 对于 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 ``` |
29 zn Mar 29, 2018 短路判断法了解一下? ``` 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; } ``` |
30 aa6563679 Mar 29, 2018 via iPhone 这种小细节没必要在意的,因为编译时编译器会优化,运行时还有 jit 再优化,最终代码不知道变成什么样了 |
31 aristotll Mar 29, 2018 我反而喜欢用三目表达式 ... |
32 iyangyuan Mar 29, 2018 via iPhone 第二种优于第一种,没什么可讨论的 |
34 Asimov01 OP @misaka19000 这就是我想要的东西,用事实说话 |
35 q397064399 Mar 29, 2018 @Asimov01 #34 效率在运行时也是不一样的,,了解下 分支预测 跟 指令冒险 还有内存屏障,你就知道 这个代码 在不同场景下 性能是完全两回事了 |
36 loveCoding Mar 29, 2018 提前判断,提前返回,增加可读性 |
37 Justin13 Mar 29, 2018 via Android 喜欢第二种,大括号能省就省,最好是 return (a > 1 ? 2 : 0) |
38 aleung Mar 29, 2018 via Android 为什么不自己测试一下呢? js 可以用 jsperf.com |
39 zone53 Mar 29, 2018 via iPhone 一般来说,函数出口只留一个是最好的吧,所以返回一个变量比较好。 |
40 Asimov01 OP @q397064399 多谢指教,我去了解了解 |
41 lolizeppelin Mar 29, 2018 via Android JS 选择第二种规范的原因难道不是为了减少文件大小 233 |
42 q397064399 Mar 29, 2018 @Asimov01 #40 谈不上指教,上面很多人 侃侃而谈,,但是都没有说到重点,,一个行 Java 代码从编译到字节码,jvm 自身的优化,然后到 cpu 执行,到指令预测 流水线上取出,查询缓存 ,两三本书都讲不完,,当然有些东西,做应用开发的 不一定要去了解那么深入,以前我的看法就是,这个玩意不就是这样嘛,有什么好神奇的, 当时觉得 Java 内存回收 不就那么回事嘛(不就是分析下有向图的节点是否可达) 看了 G1 回收器 瞬间打脸,然后发下 多线程回收各种细节需要处理,我们做技术的 了解的越多 ,在遇到问题的时候 就会有更多的选择,方案选型的经验就上来了,我是希望做技术的能时刻保持着空杯心态,虚心的去接收别人的意见,去验证 去学习 才能更好的提升自己在技术方面的能力。 |