关键字switch语句用于多条件判断,功能类似于if-else语句,两者性能也差不多,不能说switch会降低系统性能。在绝大部门情况下,switch语句还是有性能提升空间的。
但是在项目代码中,如果switch的case很多,然后代码也就多了,感觉和if-else差不多呢,总在想有什么更好的办法吗?能不能替换掉这么多的条件判断呢?
答案是有的。举个?来说明,先来个正常的switch使用方式,直接上代码。
@Slf4jpublic class TestSwitch { int resutl = 0; @Test public void testDefautl() { Long start = System.currentTimeMillis(); for(int i=0;i<10000000;i++) { //调用包含switch语句的函数 resutl = switchInt(i); } log.info("耗时:{}",System.currentTimeMillis()-start); } /** * 根据操作数不同,返回不同的值 * @param arg 参数 * @return */ protected int switchInt(int arg) { int index = arg%10+1; switch (index) { case 1: return 3; case 2: return 6; case 3: return 7; case 4: return 8; case 5: return 10; case 6: return 16; case 7: return 18; case 8: return 44; default: return -1; } }}
打印结果,耗时:77
这是对一个switch操作进行了若干次循环。为了使测试用例更加接近于现实情况,每次都使用不同索引的操作数i去测试switch的性能。就分支逻辑而言,这种switch模式的性能并不差。但是如果换一种全新的思路去替代switch呢。还是举?说明吧。
@Slf4jpublic class TestSwitch { int resutl = 0; int[] sw = new int[]{3,6,7,8,10,16,18,44}; @Test public void testDefautl() { Long start = System.currentTimeMillis(); for(int i=0;i<10000000;i++) { resutl = arrayInt(sw,i); } log.info("耗时:{}",System.currentTimeMillis()-start); } /** * 使用数组替换switch * @param sw 数组 * @param arg * @return */ protected int arrayInt(int[] sw,int arg) { int index = arg%10+1; if(index>7 || index<1) { return -1; }else { return sw[index]; } }}
打印结果,耗时:59
这个思路,使用一个连续的数组代替了switch语句。因为按索引在数组中访问数据是非常快的,至少好于switch的分支判断,因此他的速度会快于原来的实现。
参考
《Java程序性能优化》