A && B || C 的效率比 A ? B : C 更高嗎?


首先這兩個表達方式並不完全等同,舉個簡答你例子true0||2的值為2;而true?0:2的值為0。

單單就效率問題,後者更高。

他們的計算過程:

前者:

The production LogicalANDExpression : LogicalANDExpression BitwiseORExpression is evaluated as follows:

1. Let lref be the result of evaluating LogicalANDExpression.

2. Let lval be GetValue(lref).

3. If ToBoolean(lval) is false, return lval.

4. Let rref be the result of evaluating BitwiseORExpression.

5. Return GetValue(rref).

The production LogicalORExpression : LogicalORExpression || LogicalANDExpression is evaluated as follows:

1. Let lref be the result of evaluating LogicalORExpression.

2. Let lval be GetValue(lref).

3. If ToBoolean(lval) is true, return lval.

4. Let rref be the result of evaluating LogicalANDExpression.

5. Return GetValue(rref).

後者:

The production ConditionalExpression : LogicalORExpression ? AssignmentExpression : AssignmentExpression is evaluated as follows:

1. Let lref be the result of evaluating LogicalORExpression.

2. If ToBoolean(GetValue(lref)) is true, then

a. Let trueRef be the result of evaluating the first AssignmentExpression.

b. Return GetValue(trueRef).

3. Else

a. Let falseRef be the result of evaluating the second AssignmentExpression.

b. Return GetValue(falseRef).

另外,三元運算符的效率比if else高。因為if else往往會產生地址跳轉,使得緩存中預載入進來的內容失效,cache不命中,重新從內存取。而三元運算符避免了這種問題。


這兩個段代碼,根本就不能完全替代對方,討論效率又有什麼意義呢?

比如:

var A = true;
var B = 0;
var C = 1;
A B || C; // 結果1
A ? B : C; // 結果0


明確反對曲維姜的觀點。

這個世界上有少量的人寫好了編譯器優化器解釋器就是為了讓大量的人無需親自關心編譯器的細節。

這個世界上有少量的人研究這類問題就是為了讓大量的人無需研究這類問題的。

但這並不意味著少量的人不能到公開的論壇討論問題。

也不意味著僅對少量人有價值的問題就沒有拿出來討論的意義。

所以,每個問題都有價值。包括這個問題。

為了讓有價值的答案得到應有的尊重,請大家贊同楊志的觀點。

補充:有人認為性能優化不必要,這錯得太離譜了,你若是解釋器的作者,你若是編譯優化器的作者,你永遠要把性能優先!

那些總叫喊著性能無用論的人也許忘了,程序之所以有靠譜的性能,是因為編譯器優化器的作者把性能優化到了極致而已。

如果所有人都不考慮性能。。。對不起 ,很多語言完全沒有可用性。例如Java,C#,虛擬機的作者如果不考慮性能,這兩個語言根本沒法用,遠遠到不了今天的地位,如果寫Java虛擬機的人不在乎性能,如果沒有年復一年的大量的人為一點一滴優化Java虛擬機性能進行的「持久的努力」,Java只會被C跟C++使用者爆出shit。


A ? B : C 比 A B || C 效率高,這裡簡單寫了測試:http://jsperf.com/a-b-c-vs-a-b-c

其中 Other 是 IE11,不知為何 jsperf 沒認出來

大家也可以用其他瀏覽器進入那個鏈接,點 Run tests 按鈕試試


你不需要管這個兩個誰效率高,只需要知道要選後者這種形式,前者是有問題的。

因為A B || C 這種寫法在gcc裡面是會報warning的。的結合順序高於||,在兩者同時出現在一個表達式里的時候,請為做運算的部分加上括弧: (AB) || C


A B || C

A真

B假

C求值

A ? B : C

A真

B求值 不管結果真假任何

C都不會求值

2表達式 邏輯根本不一樣

使用場景不同

沒有比較的必要

另外糾結這種 i++ 快還是 ++i 快 實在 是沒必要


這根js的解析過程有關,js有個機制叫「邏輯短路」,所謂邏輯短路是指:

  1. 在」||」 運算中,第一個條件符合就結束判斷。

  2. 在」」運算中,第一個條件不符合就結束判斷。

所以A B || C語句中如果A位false後面就不用執行了,AB為True後面也不用執行了,效率要比A ? B : C 稍高。不過這點速度不會影響什麼,頂多就是作為一個知識點考察一下。


a and b or c在lua裡面是代替a ? b : c的, lua發明者在教程里說的,搞清楚使用範圍。

因為lua沒有?:運算符.


首先,前面一種寫法讓我看著頭疼。

其次,在我遇到的幾乎所有需要追求性能的場合,性能熱點也是來自上層的業務邏輯,而不是某一條語句。


這兩個的返回值都不一樣吧?


代碼的清晰性最重要,這類奇技淫巧還是讓編譯器去考慮吧。


不知道,感覺第一個效率高。因為指令集種一般有直接進行邏輯操作的指令,但是!效率高有什麼用?第一個能一眼看出來什麼意思嗎?

「程序是寫給人看的,恰好計算機能運行,僅此而已 。」

跑題了,求摺疊。

楊志的答案是對的 。剛才試了一下,第二句生成的彙編指令比第一條少。


推薦閱讀:

angular 和 React 想選擇一個學習,哪個比較好?
如何評價Node.js的新fork ayo.js?
nodejs寫的小工具,如何使用命令行直接執行?而不是先調用js文件,具體情況往下看
js很奇怪的問題,關於加法運算的問題?

TAG:前端開發 | HTML | JavaScript | 編程 |