通常而言大家普遍的认知里switch case的效率高于if else。根据我的理解而言switch的查找类似于二叉树,if则是线性查找。按照此逻辑推理对于对比条件数目大于3时switch更优,并且对比条件数目越多时switch的优势越为明显。
一、测试目的
最近与开发同学对于前面提到的性能问题,有着各自不同的见解,为证明我的观点,现设计如下测试场景验证
PS:一个方法里多达65个if else
二、测试策略
利用Junit4执行本次测试,分别设计50个、70个、100个条件式测试,每轮测试分别执行1千万、2千万、3千万、4千万、5千万和6千万次,为了力求让每轮测试不受外部因素干扰每轮测试执行10次收集信息分析。
为了让java在纯净的环境中运行。同时关闭了QQ、360、chrome等应用软件。
三、测试环境
- Java 版本信息
Java version "1.7.0_25"Java(TM) SE Runtime Environment (build 1.7.0_25-b17)Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)Junit4
- JVM配置信息
--launcher.XXMaxPermSize256m-Dosgi.requiredJavaVersion=1.6-Xms512m-Xmx1024m
- 系统信息
Windows7 旗舰版64位操作系统
- 设备信息
处理器:Intel(R) Core(TM) i3-2328M CPU @ 2.20GHz 2.20 GHz安装内存(RAM):4.00GB (3.90 GB 可用)
因此次不涉及硬盘读写,故不记录硬盘信息
四、测试脚本
因篇幅所限,测试脚本略有缩减。
1 import java.util.Calendar;
2 import java.util.GregorianCalendar;
3 import java.util.Random;
4 import org.junit.After;
5 import org.junit.Before;
6 import org.junit.Test;
7 public class ServerServiceTest {
8 Calendar calender_begin, calender_end;
9 Long time_begin, time_end; //记录测试开始时间,结束时间
10 int flagNumber = 1000000;// 迭代数
11 Random r = new Random();
12 int i = new Random().nextInt(100);//生成随机种子
13 @Before
14 public void setUp() throws Exception {
15 calender_begin = new GregorianCalendar();
16 time_begin = calender_begin.getTimeInMillis();
17 }
18 @After
19 public void tearDown() throws Exception {
20 calender_end = new GregorianCalendar();
21 time_end = calender_end.getTimeInMillis();
22 System.out.println(time_end - time_begin);
23 }
24 @Test
25 public void ifTest() {
26 for (int temp = 0; temp < flagNumber; temp++) {
27 i = r.nextInt(100);
28 if (i == 0) {
29 } else if (i == 1) {
30 } else if (i == 2) {
31 } else if (i == 3) {
32 } else if (i == 4) {
33 } else if (i == 5) {
34 } else if (i == 6) {
35 } else if (i == 7) {
36 } else if (i == 8) {
37 } else if (i == 9) {
38 } else if (i == 10) {
39 }
40 }
41 }
42 @Test
43 public void switchTest() throws InterruptedException {
44 for (int temp = 0; temp < flagNumber; temp++) {
45 i = r.nextInt(100);
46 switch (i) {
47 case 0:
48 break;
49 case 1:
50 break;
51 case 2:
52 break;
53 case 3:
54 break;
55 case 4:
56 break;
57 case 5:
58 break;
59 default:
60 break;
61 }
62 }
63 }
64 }
2 import java.util.GregorianCalendar;
3 import java.util.Random;
4 import org.junit.After;
5 import org.junit.Before;
6 import org.junit.Test;
7 public class ServerServiceTest {
8 Calendar calender_begin, calender_end;
9 Long time_begin, time_end; //记录测试开始时间,结束时间
10 int flagNumber = 1000000;// 迭代数
11 Random r = new Random();
12 int i = new Random().nextInt(100);//生成随机种子
13 @Before
14 public void setUp() throws Exception {
15 calender_begin = new GregorianCalendar();
16 time_begin = calender_begin.getTimeInMillis();
17 }
18 @After
19 public void tearDown() throws Exception {
20 calender_end = new GregorianCalendar();
21 time_end = calender_end.getTimeInMillis();
22 System.out.println(time_end - time_begin);
23 }
24 @Test
25 public void ifTest() {
26 for (int temp = 0; temp < flagNumber; temp++) {
27 i = r.nextInt(100);
28 if (i == 0) {
29 } else if (i == 1) {
30 } else if (i == 2) {
31 } else if (i == 3) {
32 } else if (i == 4) {
33 } else if (i == 5) {
34 } else if (i == 6) {
35 } else if (i == 7) {
36 } else if (i == 8) {
37 } else if (i == 9) {
38 } else if (i == 10) {
39 }
40 }
41 }
42 @Test
43 public void switchTest() throws InterruptedException {
44 for (int temp = 0; temp < flagNumber; temp++) {
45 i = r.nextInt(100);
46 switch (i) {
47 case 0:
48 break;
49 case 1:
50 break;
51 case 2:
52 break;
53 case 3:
54 break;
55 case 4:
56 break;
57 case 5:
58 break;
59 default:
60 break;
61 }
62 }
63 }
64 }