品味性能之道<十一>:JAVA中switch和if性能比较
最近与开发同学对于前面提到的性能问题,有着各自不同的见解,为证明我的观点,现设计如下测试场景验证
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 可用)
因此次不涉及硬盘读写,故不记录硬盘信息
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; //记录测试开始时间,结束时间
int flagNumber = 1000000;// 迭代数
Random r = new Random();
int i = new Random().nextInt(100);//生成随机种子
@Before
public void setUp() throws Exception {
calender_begin = new GregorianCalendar();
time_begin = calender_begin.getTimeInMillis();
}
@After
public void tearDown() throws Exception {
calender_end = new GregorianCalendar();
time_end = calender_end.getTimeInMillis();
System.out.println(time_end - time_begin);
}
@Test
public void ifTest() {
for (int temp = 0; temp < flagNumber; temp++) {
i = r.nextInt(100);
if (i == 0) {
} else if (i == 1) {
} else if (i == 2) {
} else if (i == 3) {
} else if (i == 4) {
} else if (i == 5) {
} else if (i == 6) {
} else if (i == 7) {
} else if (i == 8) {
} else if (i == 9) {
} else if (i == 10) {
}
}
}
@Test
public void switchTest() throws InterruptedException {
for (int temp = 0; temp < flagNumber; temp++) {
i = r.nextInt(100);
switch (i) {
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
default:
break;
}
}
}
}
| 条件式测试数 | 迭代数 | 1
(ms)
|
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | avg | max | min | |
| 100 | 6千万 | if | 469 | 466 | 474 | 455 | 477 | 478 | 466 | 460 | 464 | 483 | 469 | 483 | 455 |
| switch | 443 | 443 | 441 | 438 | 443 | 437 | 441 | 442 | 439 | 438 | 441 | 443 | 437 | ||
| 5千万 | if | 399 | 420 | 394 | 403 | 408 | 402 | 403 | 393 | 410 | 430 | 406 | 430 | 393 | |
| switch | 367 | 374 | 370 | 366 | 374 | 382 | 381 | 376 | 373 | 397 | 376 | 397 | 366 | ||
| 4千万 | if | 344 | 325 | 326 | 359 | 320 | 325 | 324 | 319 | 319 | 328 | 329 | 359 | 319 | |
| switch | 302 | 305 | 300 | 315 | 302 | 302 | 298 | 318 | 297 | 300 | 304 | 318 | 297 | ||
| 3千万 | if | 255 | 249 | 240 | 248 | 249 | 247 | 250 | 256 | 251 | 246 | 249 | 256 | 240 | |
| switch | 228 | 232 | 227 | 231 | 230 | 229 | 227 | 231 | 228 | 231 | 229 | 232 | 227 | ||
| 2千万 | if | 211 | 177 | 183 | 182 | 181 | 172 | 174 | 170 | 175 | 178 | 180 | 211 | 170 | |
| switch | 165 | 149 | 155 | 152 | 154 | 155 | 155 | 166 | 151 | 158 | 156 | 166 | 149 | ||
| 1千万 | if | 179 | 174 | 176 | 176 | 169 | 177 | 176 | 191 | 173 | 183 | 177 | 191 | 169 | |
| switch | 152 | 156 | 167 | 161 | 158 | 151 | 161 | 161 | 159 | 161 | 159 | 167 | 151 | ||
| 70 | 6千万 | if | 424 | 416 | 440 | 437 | 427 | 419 | 417 | 411 | 416 | 429 | 424 | 440 | 411 |
| switch | 389 | 395 | 387 | 388 | 388 | 392 | 397 | 391 | 392 | 393 | 391 | 397 | 387 | ||
| 5千万 | if | 368 | 366 | 352 | 354 | 351 | 352 | 350 | 362 | 355 | 361 | 357 | 368 | 350 | |
| switch | 327 | 327 | 326 | 324 | 328 | 327 | 324 | 323 | 330 | 325 | 326 | 330 | 323 | ||
| 4千万 | if | 321 | 300 | 295 | 293 | 284 | 283 | 281 | 335 | 276 | 281 | 295 | 335 | 276 | |
| switch | 259 | 262 | 260 | 262 | 259 | 261 | 259 | 268 | 260 | 267 | 262 | 268 | 259 | ||
| 3千万 | if | 219 | 229 | 226 | 217 | 220 | 226 | 215 | 223 | 217 | 226 | 222 | 229 | 215 | |
| switch | 199 | 197 | 203 | 199 | 199 | 199 | 197 | 200 | 200 | 197 | 199 | 203 | 197 | ||
| 2千万 | if | 149 | 158 | 152 | 155 | 177 | 159 | 159 | 158 | 161 | 150 | 158 | 177 | 149 | |
| switch | 136 | 136 | 132 | 134 | 145 | 133 | 133 | 132 | 136 | 133 | 135 | 145 | 132 | ||
| 1千万 | if | 86 | 83 | 87 | 81 | 90 | 88 | 77 | 83 | 95 | 85 | 86 | 95 | 77 | |
| switch | 65 | 67 | 67 | 67 | 68 | 71 | 67 | 68 | 68 | 68 | 68 | 71 | 65 | ||
| 50 | 6千万 | if | 374 | 361 | 363 | 363 | 362 | 364 | 376 | 366 | 372 | 373 | 367 | 376 | 361 |
| switch | 347 | 343 | 341 | 341 | 338 | 362 | 340 | 343 | 343 | 343 | 344 | 362 | 338 | ||
| 5千万 | if | 324 | 312 | 306 | 306 | 341 | 312 | 312 | 299 | 307 | 307 | 313 | 341 | 299 | |
| switch | 289 | 287 | 285 | 283 | 291 | 288 | 290 | 288 | 290 | 281 | 287 | 291 | 281 | ||
| 4千万 | if | 287 | 247 | 251 | 252 | 265 | 247 | 248 | 256 | 252 | 256 | 256 | 287 | 247 | |
| switch | 239 | 237 | 236 | 229 | 243 | 230 | 235 | 232 | 228 | 228 | 234 | 243 | 228 | ||
| 3千万 | if | 193 | 196 | 195 | 197 | 203 | 198 | 201 | 188 | 200 | 204 | 198 | 204 | 188 | |
| switch | 184 | 178 | 181 | 175 | 173 | 172 | 176 | 184 | 193 | 174 | 179 | 193 | 172 | ||
| 2千万 | if | 128 | 129 | 133 | 145 | 133 | 139 | 139 | 130 | 131 | 143 | 135 | 145 | 128 | |
| switch | 117 | 118 | 118 | 117 | 115 | 120 | 114 | 113 | 116 | 118 | 117 | 120 | 113 | ||
| 1千万 | if | 81 | 68 | 82 | 75 | 76 | 68 | 69 | 79 | 91 | 75 | 76 | 91 | 68 | |
| switch | 60 | 57 | 60 | 60 | 59 | 65 | 59 | 62 | 61 | 60 | 60 | 65 | 57 |


2015-8-23 15:17:18 跟新
interface Service{
public void execute();
public <T> T eval();
}
public class Strategy{
private static Concrunthashmap<String,function> content = new Concrunthashmap<String,function>();
public void register(String name,Clas<T> xxx){
if(!content.has(name)){
content.put(xxx);//这里隐去了反射生成对象的过程
}
}
public void execute(String name){
content.get(name).execute();
}
public void eval(String name){
content.get(name).eval();
}
}
class HelloServiceImpl implements Service{
public void execute(){
print "hello world";
}
public String eval(){
return "hello world";
}
}
class HiServiceImpl implements Service{
public void execute(){
print "hi world";
}
public String eval(){
return "hi world";
}
}
品味性能之道<十一>:JAVA中switch和if性能比较的更多相关文章
- Java基础知识强化19:Java中switch分支语句
java中switch语句: 这里expression控制表达式的数据类型只能是byte.short.char.int四种整型类型和枚举类型,不能是boolean类型: Java7(1.7)改进了sw ...
- java中switch、while、do...while、for
一.Java条件语句之 switch 当需要对选项进行等值判断时,使用 switch 语句更加简洁明了.例如:根据考试的名次,给予前 4 名不同的奖品.第一名,奖励笔记本一台:第二名,奖励 IPAD ...
- Java中switch对整型/字符型/字符串型具体实现细节
转自:http://www.hollischuang.com/archives/61 Java7中switch中支持的数据类型有: byte short int char String类型 其实swi ...
- 浅谈Java中switch分支语句
前言: 在程序中遇到多分支选择的时候,想必大家都喜欢用if...else if...else...语句,尤其是初学者,因为在了解switch语句之前,我也是只会用if...else语句.那么现在看完这 ...
- Java学习笔记十一:Java中的方法
Java中的方法 一:什么是方法: 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 学过C语言或者其他语言的应该都知道函数这个东西,在Java中,其实方法就是函数,只不过叫法不同,在 ...
- Java学习之道:Java中十个常见的违规编码
近期,我给Java项目做了一次代码清理工作.经过清理后,我发现一组常见的违规代码(指不规范的代码并不表示代码错误)反复出如今代码中.因此,我把常见的这些违规编码总结成一份列表,分享给大家以帮助Java ...
- java中Switch的实现原理浅谈
switch的转换和具体系统实现有关,如果分支比较少,可能会转换为跳转指令(条件跳转指令和无条件跳转指令).但如果分支比较多,使用条件跳转会进行很多次的比较运算,效率比较低,可能会使用一种更为高效的方 ...
- java中switch的用法以及判断的类型有哪些(String\byte\short\int\char\枚举类型)
switch关键字对于多数java学习者来说并不陌生,由于笔试和面试经常会问到它的用法,这里做了一个简单的总结: 能用于switch判断的类型有:byte.short.int.char(JDK1.6) ...
- java中switch的用法
switch关键字对于多数java学习者来说并不陌生,由于笔试和面试经常会问到它的用法,这里做了一个简单的总结: 能用于switch判断的类型有:byte.short.int.char(JDK1.6) ...
随机推荐
- /src/struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC ...
- Redis服务器开启远程访问
重启 ps aux|grep redis root 32684 0.0 0.0 48452 6944 ? Ssl 21:27 0:00 ./redis-server *:6379 kill了这个进程 ...
- boot中 Quartz注入spring管理类失败
在项目中用到了Quartz,想在里面实现业务操作发现sping类注入总是失败.后来网上查询了一下解决办法.下面把我成功解决问题的这个版本发出来,大家一起学习一下. 在quartz 会发现 job中无法 ...
- Java NIO Path
Java NIO Path Creating a Path Instance Creating an Absolute Path Creating a Relative Path Path.norma ...
- godep 包管理
go get -u -v github.com/tools/godep godep save
- 获取url后面的参数的方法
1. function GetRequest() { var url = 'http://wwww.jb51.net/?q=js'; //获取url中"?"符后的字串 if (ur ...
- mysql 在登陆的时候出现error 1045 (28000): 错误解决办法
错误显示:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 解决方案: 1.找到配 ...
- kafka消息队列的简单理解
kafka在大数据.分布式架构中都很流行.kafka可以进行流式计算,也可以做为日志系统,还可以用于消息队列. 本篇主要是消息队列相关的知识. 零.kafka作为消息队列的优点: 分布式的系统 高吞吐 ...
- 链表中倒数第k个结点(python)
题目描述 输入一个链表,输出该链表中倒数第k个结点 # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.v ...
- JAVA 关于JNI本地库加载
1.调用JNI的时候,通常我们使用System.loadLibrary(String libname)来load JNI library, 同样也可以使用System.load(String file ...