1. 程式人生 > >java的if else 和三目運算的效率問題

java的if else 和三目運算的效率問題

1.從型別轉換上看,因為三目運算子在做判斷的時候需要考慮到型別轉換的問題,而if else 不需要考慮型別轉換。  所以 if else 效率高一點。  2.從總體上看  A:需要考慮到迴圈自身所佔用的時間。  B:需要考慮到賦值以及迴圈內的其他運算子所佔用的時間。  所以 三目運算子效率高一點.

  接下來一段程式碼來演示 2.

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;
    }
}

結果:


------->min = 1.9841269841269842
------->max = 3.5161290322580645
------->ave = 2.6170264636067144

可以看出if else耗時是三目運算子的2.6倍之多!