品味性能之道十一:JAVA中switch和if性能比较

通常而言大家普遍的认知里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.XXMaxPermSize
256m
-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 }
View Code 

五、测试结果
以下是收集的测试数据,时间单位毫秒(ms)。其实这种数据看起来很难看出问题所在。
条件式测试数迭代数 1
(ms)
2345678910avgmaxmin
1006千万if469466474455477478466460464483469483455
switch443443441438443437441442439438441443437
5千万if399420394403408402403393410430406430393
switch367374370366374382381376373397376397366
4千万if344325326359320325324319319328329359319
switch302305300315302302298318297300304318297
3千万if255249240248249247250256251246249256240
switch228232227231230229227231228231229232227
2千万if211177183182181172174170175178180211170
switch165149155152154155155166151158156166149
1千万if179174176176169177176191173183177191169
switch152156167161158151161161159161159167151
706千万if424416440437427419417411416429424440411
switch389395387388388392397391392393391397387
5千万if368366352354351352350362355361357368350
switch327327326324328327324323330325326330323
4千万if321300295293284283281335276281295335276
switch259262260262259261259268260267262268259
3千万if219229226217220226215223217226222229215
switch199197203199199199197200200197199203197
2千万if149158152155177159159158161150158177149
switch136136132134145133133132136133135145132
1千万if86838781908877839585869577
switch65676767687167686868687165
506千万if374361363363362364376366372373367376361
switch347343341341338362340343343343344362338
5千万if324312306306341312312299307307313341299
switch289287285283291288290288290281287291281
4千万if287247251252265247248256252256256287247
switch239237236229243230235232228228234243228
3千万if193196195197203198201188200204198204188
switch184178181175173172176184193174179193172
2千万if128129133145133139139130131143135145128
switch117118118117115120114113116118117120113
1千万if81688275766869799175769168
switch60576060596559626160606557


六、测试结果分析
纯数据的测试结果,很难进行分析,经过整理以后如下图:
if-100为if执行100条件式测试数,switch-100为switch执行100条件式测试数;
根据此图表结果,大家已经可能很清晰的看出IfSwtich的性能对比结果了。但是如此细微的性能差异,实现了业务就行了,何必关注这种费心又麻烦的事呢?
哈哈哈,性能测试更多时候,也是沟通问题,更是行政问题。

 

七、总结
这次验证过程,其实就是一次简单的性能测试过程,也就是——需求挖掘->明确目的->设计策略->准备环境->脚本编写->收集数据->结果分析->测试报告。此处略去的报告内容,因为不需要什么报告了。哈哈哈!(大家懂的)
就大量条件式的业务场景而言,除了利用switch以外,其实还可以用到枚举(enum)作为条件式,抽象每个判断式导向为函数式(function)。可能哪天我心情好会把利用enum优化的代码给放出来。

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";}
}

 

系列博客:
品味性能之道<一>:性能测试思维与误区
品味性能之道<二>:性能工程师可以具备的专业素养
品味性能之道<三>:方法论
品味性能之道<四>:管理重于技术
品味性能之道<五>:SQL分析工具
品味性能之道<六>:图形化SQL分析工具
品味性能之道<七>:索引基础
品味性能之道<八>:Loadrunner关联技巧与字符处理
品味性能之道<九>:利用Loadrunner编写socket性能测试脚本简述
品味性能之道<十>:Oracle Hint
品味性能之道<十一>:JAVA中switch和if性能比较
深入理解Loadrunner中的Browser Emulation
使用Loadrunner对IBM MQ进行性能测试
怎么做性能测试--响应时间

转载于:https://www.cnblogs.com/snifferhu/p/3500864.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

miniblink载入html,winform使用miniblink展示html(全屏)

【实例简介】使用miniblink 展示html的例子&#xff0c;miniblink基于chromium的浏览器控件【实例截图】点击下图中的百度&#xff0c;即可 实现全屏访问 百度网页 &#xff0c;如下图&#xff1a;其实是winform嵌入的这个网页&#xff0c;打开即是 全屏效果【核心代码】using …

javax.imageio.IIOException: Unsupported Image Type

把图片的模式用ps从CMYK转为RGB就ok了。 CMYK也称作印刷色彩模式&#xff0c;是一种依靠反光的色彩模式&#xff0c;和RGB类似&#xff0c;CMY是3种印刷油墨名称的首字母&#xff1a;青色Cyan、品红色Magenta、黄色Yellow。而K取的是black最后一个字母&#xff0c;之所以不取首…

html 手机访问优化,移动端首屏优化

[TOC]## 页面加载为什么打开一个 H5 页面会有一长段白屏时间&#xff1f;因为它做了很多事情&#xff0c;大概是&#xff1a;~~~初始化 webview -> 请求页面 -> 下载数据 -> 解析HTML -> 请求 js/css 资源 -> dom 渲染 -> 解析 JS 执行 -> JS 请求数据 -&…

2014年10月末

迄今&#xff0c;我的第一个目标已达到。接下来就要为第二个目标做准备了&#xff0c;而且是长期&#xff0c;不可松懈的准备。大体上计划用10个月吧&#xff01; 2014年&#xff0c;10月末&#xff0c;到时给出一个结果&#xff01;转载于:https://www.cnblogs.com/zhangyabin…

html5 indexeddb 排序,html5 – 在IndexedDB中,有没有办法进行排序复合查询?

本回答中使用的术语“复合查询”是指在其WHERE子句中涉及多个条件的SQL SELECT语句。虽然indexedDB规范中没有提到这样的查询&#xff0c;但您可以通过创建一个包含一组属性名称的keypath的索引来近似复合查询的行为。这与创建索引时使用多条目标志完全无关。多条目标志调整ind…

Spark源码分析 -- SchedulableBuilder

SchedulableBuilder就是对Scheduleable tree的封装, 在Pool层面(中间节点), 完成对TaskSet的调度(FIFO, FAIR) 在TaskSetManager 层面(叶子节点), 完成对TaskSet中task的调度(locality)以及track(retry) TaskSetManager 用于封装TaskSet, 主要提供对单个TaskSet内部的tasks的t…

html设置照片模糊效果,CSS如何实现照片模糊?

在开发网页时&#xff0c;照片模糊处理会经常被使用&#xff0c;比如当我们背景图的模糊&#xff0c;当我们不想背景图片过于突出影响美观时&#xff0c;就可以设置将照片模糊处理&#xff0c;突出文字部分。那么 CSS 如何实现照片模糊呢&#xff1f;这篇文章 w3cschool 小编告…

rhel6用centos163 yum源

cd /etc/yum.repos.d/wget wget http://mirrors.163.com/.help/CentOS6-Base-163.reposed -i "s/\$releasever/6/" CentOS6-Base-163.repo 转载于:https://www.cnblogs.com/yanghuahui/p/3507313.html

女生学计算机未来出路,计算机真的已经烂大街了吗,女生学计算机没出路吗?...

假的。先说第一个问题&#xff1a;情况是&#xff0c;现在程序员是很多&#xff0c;但多半是中低端程序员&#xff0c;高端程序员供不应求&#xff0c;薪资一涨再涨。现在的程序员门槛一高再高&#xff0c;就是为了淘汰掉那些半吊子的程序员。如果你是靠从网上复制粘贴代码的“…

简明易懂的call apply

在iteye看到一篇对call解释得相当简明易懂&#xff0c;觉得得宣传一下 &#xff1a; http://uule.iteye.com/blog/1158829 一、方法的定义 call方法: 语法&#xff1a;call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义&#xff1a;调用一个对象的一个方法&#xff0c;以另一…

计算机网络有哪些技能知识,网络基础知识及操作技能.ppt

网络基础知识及操作技能 主讲人 李春报 一、计算机网络概述 1、计算机网络的概念 计算机网络是把分布在不同地理位置上的计算机、终端&#xff0c;用通信设备和通信线路连结起来&#xff0c;再配以相应的网络软件&#xff0c;从而使众多计算机可以方便地互相传递信息&#xff0…

这些快捷键要学会使用啊

史上最全苹果键盘及Xcode快捷键整理 它们分别是command、option、control、shift以及esc除了command键上有标志之外其余四个可以通过这四个键对比比较出来。 谢谢原文作者提供较详细的快捷键说明。 常用的Xcode快捷键&#xff0c;工欲善其事&#xff0c;必先利其器。mac的键盘和…

目前计算机应用最广泛的区域是,自考《计算机应用基础》试题练习(一)

以下是关于2019年4月上海自考《计算机应用基础》串讲复习&#xff0c;由上海自考通整理发布&#xff0c;希望对即将参加自考的考生们能有帮助&#xff0c;更多的复习资料可点击查看历年真题。第一章一、选择1. 世界第一台电子计算机生产日期是( A )。A. 1946 B. 1945 C. 1947 D…

CSS元素选择器

1、在css元素选择器中飞&#xff0c;最重要的是HTML页面中的元素的定位&#xff1b; p { color: red; } h1{ color:blue; font-family:sans-serif; } 2、css选择器分组: 将 h2 和 p 选择器放在规则左边&#xff0c;然后用逗号分隔&#xff0c;就定义了一个规则。其右边的样式&a…

计算机基础知识二进制转换,计算机基础知识数制转换

二、数制转换1.十进制数到二进制数的转换(1)、整数部分 除2取余法(余数为0为止)&#xff0c;最后将所取余数按逆序排列。实例:将十进制数23转换为二进制数2| 232| 11 余数 12| 5 余数 12| 2余数 12|1 余数 00 余数 1结果为 (23)10 (10111)2(2)、小数部分 乘2取整法…

iOS基础 - 控制器

一、当两个控制器互为父子关系的时候&#xff0c;它们的view一般也是互为父子关系 比如想添加A控制器的view到B控制器的view上&#xff0c;就应该让A控制器成为B控制器的子控制器&#xff0c;而B控制器就称为A控制器的父控制器 //[B addChildViewController:A]; // A就会存在于…

计算机专业英语第07章,计算机专业英语电子教案第07章.ppt

计算机专业英语电子教案第07章Computer English Chapter 7 Programming Languages 复杂定语(从句)的翻译技巧之二 四、句子结构调整法 有时&#xff0c;原文句中一个中心词带有若干修饰成分&#xff0c;但它们既不是纯“并列”头系&#xff0c;也不是规则的“连环”关系&#x…

关机计算机专业,电脑关机后自动重启怎么回事

日常生活中&#xff0c;大部分的网友朋友们都碰到过电脑在正常使用时&#xff0c;突然电脑自动重启了&#xff0c;并且多次尝试强制关机都无效&#xff0c;令人费神。下面小编针对此问题的原因给出了几种方法&#xff0c;希望对大家有所帮助&#xff0c;快来看看吧&#xff01;…

PHP验证码常用的函数记录

1、绘制真彩画布&#xff0c;返回资源类型的图像标识符 resource imagecreatetruecolor ( int $width , int $height ) 例&#xff1a;$image imagecreatetruecolor( 30, 20 ); 2、为创建的画布分配背景颜色&#xff0c;参数中的颜色&#xff08;分别是红绿蓝&#xff09;&…

计算机无法打开打印机ip端口,讲述Win10电脑上无法选择打印机端口的解决方法...

我们在Win10电脑上使用打印机&#xff0c;进行打印材料是很平常的一件事&#xff0c;但是有用户在Win10电脑上&#xff0c;操作打印机时&#xff0c;出现了打印机端口无法选择的问题&#xff0c;不知道该怎么办&#xff1f;如果打印机端口无法正常选择的话&#xff0c;就代表我…