代码里面写 if else 或者 switch case 语句,很常见,那么这2个写法除了姿势不一样以为,他们的效率是不是也差距比较大呢?

1,switch case 比 一个个if else快吗?

2,switch case会因为case的数据类型越简单,而使得执行效率提高不少吗?

下面测试下

大师兄

总体来说:2者差别不大,使用谁,代码执行效率,都没有啥质的飞跃。

有的说 switch case可以直接定位到对应的case的地方,这个“直接”,是你看到的,其实,他还是一个个的去比较的。没啥直接跳到对应case去的。那是表面现象,是你debug时候的错觉。

所以,网上的言论:

“switch case 可以快速定位到case,在使用不同的case的时候,效率比一个个if效率高”

这个是不存在的,我上面的充分的说明了问题,(有毛病的可以指出来)

测试代码如下:

package com.lxk.fast; 
 
import com.lxk.model.enumModel.Type; 
 
/** 
 * if else 和 switch case 以及 case使用枚举  的效率比较 
 * 
 * @author LiXuekai on 2019/6/21 
 */ 
public class SwitchCaseIsFasterThanIfElse { 
    public static void main(String[] args) { 
        test(); 
    } 
 
    private static void test() { 
        //9,为公平起见,都在第九个匹配 
        int lxk = Type.JSON.ordinal(); 
        Type type = Type.JSON; 
        char aChar = '9'; 
        while (true) { 
            testSwitchCaseInt(lxk); 
            testIfElse(lxk); 
            //testSwitchCaseChar(aChar); 
            //testSwitchCaseEnum(type); 
        } 
    } 
 
    private static void testSwitchCaseEnum(Type type) { 
        switch (type) { 
            case _INTEGER: 
                sameFunction(); 
                break; 
            case INTEGER: 
                sameFunction(); 
                break; 
            case _LONG: 
                sameFunction(); 
                break; 
            case LONG: 
                sameFunction(); 
                break; 
            case _DOUBLE: 
                sameFunction(); 
                break; 
            case DOUBLE: 
                sameFunction(); 
                break; 
            case _FLOAT: 
                sameFunction(); 
                break; 
            case FLOAT: 
                sameFunction(); 
                break; 
            case STRING: 
                sameFunction(); 
                break; 
            case JSON: 
                sameFunction(); 
                break; 
            case OBJECT: 
                sameFunction(); 
                break; 
            default: 
                sameFunction(); 
        } 
 
    } 
 
    private static void sameFunction() { 
        String lxk = "li xue kai"; 
    } 
 
    private static void testSwitchCaseInt(int type) { 
        switch (type) { 
            case 0: 
                sameFunction(); 
                break; 
            case 1: 
                sameFunction(); 
                break; 
            case 2: 
                sameFunction(); 
                break; 
            case 3: 
                sameFunction(); 
                break; 
            case 4: 
                sameFunction(); 
                break; 
            case 5: 
                sameFunction(); 
                break; 
            case 6: 
                sameFunction(); 
                break; 
            case 7: 
                sameFunction(); 
                break; 
            case 8: 
                sameFunction(); 
                break; 
            case 9: 
                sameFunction(); 
                break; 
            case 10: 
                sameFunction(); 
                break; 
            default: 
                sameFunction(); 
        } 
    } 
 
    private static void testSwitchCaseChar(char type) { 
        switch (type) { 
            case '0': 
                sameFunction(); 
                break; 
            case '1': 
                sameFunction(); 
                break; 
            case '2': 
                sameFunction(); 
                break; 
            case '3': 
                sameFunction(); 
                break; 
            case '4': 
                sameFunction(); 
                break; 
            case '5': 
                sameFunction(); 
                break; 
            case '6': 
                sameFunction(); 
                break; 
            case '7': 
                sameFunction(); 
                break; 
            case '8': 
                sameFunction(); 
                break; 
            case '9': 
                sameFunction(); 
                break; 
            case 's': 
                sameFunction(); 
                break; 
            default: 
                sameFunction(); 
        } 
    } 
 
    private static void testIfElse(int lxk) { 
        if (lxk == 0) { 
            sameFunction(); 
        } else if (lxk == 1) { 
            sameFunction(); 
        } else if (lxk == 2) { 
            sameFunction(); 
        } else if (lxk == 3) { 
            sameFunction(); 
        } else if (lxk == 4) { 
            sameFunction(); 
        } else if (lxk == 5) { 
            sameFunction(); 
        } else if (lxk == 6) { 
            sameFunction(); 
        } else if (lxk == 7) { 
            sameFunction(); 
        } else if (lxk == 8) { 
            sameFunction(); 
        } else if (lxk == 9) { 
            sameFunction(); 
        } else if (lxk == 10) { 
            sameFunction(); 
        } else { 
            sameFunction(); 
        } 
 
    } 
} 

然后,还是有点好奇,这个case,对应不同的情况,比如使用int,或者枚举,或者char类型,这个case对应的类型越简单,效率是不是越高呢?

然后,就又有了上面代码的其他测试,注释状态的。

然后,打开注释,继续使用JProfiler监测一下,看看差别。

大师兄

大师兄

大师兄

看了下,char比int简单,int比枚举简单。

但是,最终,他们的效率对比,不管使用谁,好像效率,也没啥质的飞跃。

最后,

注意一下,

每个时间占比图里面,调用的sameFunction()这个方法占用的时间并不多,

第一个图,这个方法占的比例是 15.6% / 50.6% = 30.8%

第二个图,这个方法占的比例是 9.9% / 32.9% = 30.1%

得到的理论,一个 if else 或者 switch case 在来来回回的路上,竟然耗费了70%的性能。

怎么才能把这个时间给降低点呢!!!!


发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Java 代码优化:使用构造函数和使用一个个setter的效率差别知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。