• 关于if else 和 三目运算符的效率问题-java


    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倍之多!

     
  • 相关阅读:
    [TJOI2015]棋盘
    [FJOI2017]矩阵填数——容斥
    [ZJOI2016]小星星
    [HEOI2013]SAO ——计数问题
    ZJOI2008 骑士
    莫队算法——暴力出奇迹
    可持久化线段树
    dij与prim算法
    LCA 最近公共祖先
    Linux 设置交换分区
  • 原文地址:https://www.cnblogs.com/guoziyi/p/7153821.html
Copyright © 2020-2023  润新知