代码里面写 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%的性能。
怎么才能把这个时间给降低点呢!!!!