三目運算符與ifelse


總結:三目運算符從代碼角度多了代碼,但是運行速度不只是與代碼量有關,三目運算符從運行角度,速度是比 if else快的! 

以下摘自搜索哦!
今天寫了一個圖片輪播的小demo,用到了判斷
先試了一下if else,代碼如下:
複製代碼 代碼如下:


if(n >= count-1){
n =0;
}else{
n ++;
}
隨後代碼寫完了,準備優化一下代碼,將此段改成了三目運算符的寫法
 
複製代碼 代碼如下:


n = n >= (count-1) ? n=0 : n++
結果完全不同
隨後研究了一下這兩者的區別,總結爲一句話:三目運算有返回值,if else沒有返回值
做了如下測試:
 
複製代碼 代碼如下:


var n=1;
 if(n>1){
    n=0;
}else{
    n++;
}
console.log(n);
輸出結果:2


三目運算如下:
 
複製代碼 代碼如下:


var n=1;
n = n>1?0 : n++;
console.log(n);
輸出結果爲:1
插入一段其他內容:++n和n++的區別:簡單地說,都是 n 自加1。區別是,n++是執行完後面的語句才加1;而++n 就先做 n+1才執行後面的語句
那麼對於++n呢
if else 語句
複製代碼 代碼如下:


var n=1;
 if(n>1){
    n=0;
}else{
    ++n;
}
console.log(n);
輸出結果:2


三目運算結果
 
複製代碼 代碼如下:


var n=1;
n = n>1?0 : ++n; 
console.log(n); 輸出結果爲:2


 
可以看出if else和三目運算的區別了吧~~~
 
n++和++n在此驗證中,沒有任何區別,因爲if else都是計算結果之後的,不會返回n,沒有任何返回值
 
但是對於三目運算,n++返回的n值爲n本身,++n返回的n值爲n+1之後的結果
讀了本文,小夥伴們是不是對js中的三目運算符和if else有了新的認識呢。
=======================================================================================================================\
今日又看到有人在討論If/Else和三目運算符的效率差別到底有多大,但看到所給出的方案並不嚴謹,主要問題如下:
1.沒有考慮循環自身所佔用的時間
2.沒有考慮賦值以及循環內的其他運算所佔用的時間
因此本文給出一個改進的算法統計,在除去上述影響的情況下,給出一個相對客觀的數據。如有意見,歡迎拍磚!
廢話少說,上代碼
Java code
public class TestIfElse {
 
    public static void main(String[] args) {
        double f = 0;
        final int times = 100;
        double min = 1000;
        double max = 0;
        //取100次平均。其實可以再多,但是耗時太長了,意義並不是很大。
        for(int i=0; i<times; i++){
            double df = test();
            System.out.println("df["+i+"] = "+df);
            f +=df;
            if(min>df){
                min = df;
            }
            if(max<df){
                max = df;
            }
        }
        f /=times;
        System.out.println("------->min = "+min);
        System.out.println("------->max = "+max);
        System.out.println("------->ave = "+f);
    }
 
    private static double test(){
        //來點計算,用處不大。
        long sum = -1;
        //循環次數,有點大哦,自己悠着點調
        final int max = 100000000;
        //下面給出一個包含循環和計算的耗時統計,作爲一個基礎。後面的統計必然包含此部分時間
        long timeS = System.currentTimeMillis();
        for(int i=0; i<max; i++){
            sum = i+i;
        }
        long timeE = System.currentTimeMillis();
        long delta = timeE - timeS;
         
        //計算出一個布爾值,免得後面還要計算而佔用時間,造成誤差。
        boolean flag = sum>0;
        //下面是If/Else(包含循環和計算)的耗時統計,真實耗時應當除去上面的基準值
        long timeS1 = System.currentTimeMillis();
        for(int i=0; i<max; i++){
            if(flag){
                sum = i+i;
            }else{
                sum = i+i;
            }
        }
        long timeE1 = System.currentTimeMillis();
        long delta1 = timeE1 - timeS1;
        //這是真實的耗時計算
        long realIfElse = delta1-delta;
         
         
        //下面是三目運算符(包含循環和計算)的耗時統計,真實耗時同樣應當除去前面的基準值
        long timeS2 = System.currentTimeMillis();
        for(int i=0; i<max; i++){
            sum = flag?i+i:i+i;
        }
        long timeE2 = System.currentTimeMillis();
        long delta2 = timeE2 - timeS2;
        //這是真實的耗時計算
        long realTri = delta2-delta;
 
        //返回耗時比率,以反映效率差別
        double f = (double)realIfElse / realTri;
        return f;
    }
}


結果:
Java code
?
1
2
3
------->min = 1.9841269841269842
------->max = 3.5161290322580645
------->ave = 2.6170264636067144


看到了吧?If/Else耗時是三目運算符的2.6倍之多!
----------------------------------------------------------------------------------------------------------------------
可見後者比前者多了兩條指令。
    If-else無論在何種情況下(在if中或者else中),都是通過先將需要賦的變量值傳給寄存器然後再通過寄存器賦值給temp變量 。即
    mov edx,b; mov temp,edx ;
    然而,對於三目運算,它其中一步卻增加多了一個臨時變量。  
    mov ecx,b;mov NEWTEMP,ecx;
    mov edx,NEWTEMP;mov temp;edx;
    
    以下是一個同學給我的答案(他從編譯原理課上學的):
    因爲三目運算是先運算,再賦值!
    例如 :  
       temp = a > b ? a : b ;
       a > b ? a : b 是運算,  temp = (a > b ? a : b )是賦值。
       所以在三目的彙編裏面  a,b,temp地址 爲10h,14h 18h  無論a>b的結果怎樣,都有先將它後               面的結果保存在地址爲  24h 的中間變量裏面 ,然後再 賦值給地址爲 18h 的temp變量中!
               
     而 if 語句是直接賦值 ,不存在運算,所以快了一點。




然後根據這原理,可以知道 ++i 比 i++ 快, x+=y 比 x=x+y 快。
不過,我們寫程序的時候可以忽略它們,因爲這種東西,編譯器已經幫我們優化了!!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章