三元運算子和ifelse

2021-10-24 14:56:46 字數 921 閱讀 6725

原理

cpu處理模式

首先,需要明白cpu底層的處理方式。

cpu是通過流水線處理來獲得高效能的。所謂流水線,簡單來說就是當cpu在處理當前指令的時候,後面已經有n條指令在後面排隊等待你去執行了。這樣,當你要執行下一條指令的時候,你不用再去找那條指令,它已經乖乖跟在前一條指令的屁股後面等你去執行了。

if…else…處理模式

那問題就在於,後面的指令需要確認乙個排隊順序。如果程式設計師也是簡單的編寫流水線式的**,對於cpu來說指令排序很容易。但是if…else…就不一樣了。

if…else…簡單來說就是:當我滿足條件,那我就執行a,如果我不滿足條件,我就執行b。但是對於給指令排隊的cpu來說,它還沒執行到判斷條件這一步,不知道你滿不滿足呀!這樣它就不好給指令排隊了。

假設它按照你滿足條件,把a指令排在你後面。那麼當執行到最後發現你不滿足條件,那麼就得把之前排好的佇列清空,重新給你把b指令排到後面給你執行。這種**錯誤的懲罰將會導致cpu處理時間更長。

假設**準確的話,每次呼叫函式大概13個時鐘週期,而只要**錯誤,可能就需要大約44個時鐘週期了。

三元運算處理模式

對於三元運算子,它的處理方法就不同了。

x=y>0?a:b;

當cpu要給這條指令排隊時,它會將兩種結果都進行排隊,也就是表示式a和表示式b都會被cpu進行處理,算出結果。

計算對cpu來說反而是它更喜歡的事情,你只要能排隊排好了,讓它能流水線模式來執行,對於它來說總體速度反而更快。

cpu會將兩種結果a和b都給計算出來(這跟if…else…不同,其只會計算一種結果),最後再判斷y>0?。如果y>0,則選擇a,拋棄b; 否則就選擇b,拋棄a。

當然,這只是很細節很細節的東西,平時使用應該也感覺不出多大的差別。而且三元運算子其實使用的範圍也挺侷限的,一些簡單點的選擇可以使用,如果是一些複雜的,把**寫得讓人看都看不懂,那就沒意思了。

三元運算子與if else的對比

三元運算子與if.else有時能互換,之前總是使用if.else,也不知道他兩之間效能怎樣。今天做個測試對比一下。package test public class test private static void test1 long endtime system.currenttimemilli...

三元運算子

根據條件執行兩個語句中的其中乙個。test?語句1 語句2引數 test 任何boolean 表示式。語句1當 test 是true時執行的語句。可以是復合語句。語句2當 test 是false時執行的語句。可以是復合語句。說明?運算子是if.else語句的快捷方式。它通常被用作較大表示式的一部分,...

三元運算子

先定義a和b 兩個數比較 int a 123 int b 144 通過定義big來反映a和b誰更小 int big a b?a b 通過定義small來反映a和b誰更小 int small asystem.out.println a和b之間較大的數 big system.out.println a和...