品味性能之道十一: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 …

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

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

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

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

这些快捷键要学会使用啊

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

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

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

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

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

计算机WIN7动态硬盘分区,win7硬盘分区教程

win7硬盘分区教程硬盘分区其实是对硬盘的一种格式化&#xff0c;进行了此步骤后才可以使用硬盘保存各种数据&#xff0c;下面是小编为大家详细介绍win7硬盘分区教程&#xff0c;欢迎大家阅读&#xff01;一、进入磁盘管理工具我们点击要对硬盘进行分区&#xff0c;我们首先得知…

计算机的alu的作用,算术逻辑运算单元(ALU)的基本功能是什么 – 手机爱问

2004-12-28解释定点运算器的功能和组成部件解释定点算器包括ALU\阵列乘除器\寄存器\多路开关\三态缓冲器\数据总线等逻辑部件。运算器的设计,主要是围绕ALU和寄存器同数据总线之间如何传送操作数和运算结果进行的。在决定方案时,需要考虑数据传送的方便性和操作速度,在微型机和…

笔记本上的小键盘计算机怎样用,笔记本数字小键盘不能用怎么办【解决方法】...

许多笔记本键盘中都会携带一个小键盘&#xff0c;与台式电脑的键盘大小差不多&#xff0c;小键盘上面标注着阿拉伯数字0到9&#xff0c;非常适合会计行业的人们使用。小键盘可以帮助人们快速地将数字敲打出来&#xff0c;使用起来极为方便。要知道&#xff0c;大键盘属于输入设…

批量Append

GIS数据是按照图幅号组织的&#xff0c;现需要每个单独的系统数据进行拼接。 以下是批量追加代码&#xff1a; # --------------------------------------------------------------------------- # Append.py # Created on: 2013-01-21 10:25:22.00000 # (generated by ArcGI…

jquery ajax php中 css样式不显示,Chrome浏览器在Ajax同步调用之前不会显示Jquery的动态css Propery更改...

我有如下因素HTML节点&#xff1a;上的click事件会触发聊天对象的方法this.addUser function(trigger_node, id, is_silent, session, show_block_message){if(trigger_node){this.bk_trigger_node.html trigger_node.innerHTML;this.bk_trigger_node.cn trigger_node.class…

email协议与服务器关系,常见的邮件协议:POP3、IMAP、SMTP之间的区别和联系

POP3POP3是Post Office Protocol 3的简称&#xff0c;即邮局协议的第3个版本&#xff0c;是TCP/IP协议族中的一员&#xff0c;主要用于支持使用客户端远程管理在服务器上的电子邮件。POP3是因特网电子邮件的第一个离线协议标准&#xff0c;允许用户从服务器上把邮件存储到本地主…

php 连接mssql

以前用的都是mysql&#xff0c;今天突然想用下mssql&#xff0c;起先用的是sql server200. 第一种方法 打开mssql.dll拓展。然后把mssql.secure_connection off改为on 使用mssql拓展。类似于mysql拓展库 $connmssql_connect((local),sa,); if(!$conn){ //die(mssql_error()); …

2013年未之wpf项目乱述

不知识为何现已很少在网上发帖,貌似人生的方向已经看的七七八八.要么用心工作,要么自主创业.无论怎么样,对于现在的我来说都是一种淡定的选择。作为一个c#程序员&#xff0c;今年下半年开始使用wpf&#xff0c;更觉得wpf将来肯定会是win 客户端上的首选技术。 今年在公司共用wp…

(转) PowerDesigner中Table视图同时显示Code和Name

PowerDesigner中Table视图同时显示Code和Name,像下图这样的效果&#xff1a; 实现方法&#xff1a;Tools-Display Preference 转载于:https://www.cnblogs.com/wallis0922/p/3548402.html

C语言编程基础 打印图形

C语言中用循环可以打印出各种图形1 直角三角形(靠右直立)&#xff1a;部分代码int i,j;for (i0; i<6; i) {for (j6;j>i ;j-- ) {printf("");}for (j0; j<i; j) {printf("*");}printf("\n");}2.等腰三角形&#xff08;直立&#xff09;部…

chrome密码管理

chrome://settings/passwords ------------------------------- [系统盘]:\Documents and Settings\[用户名]\Local Settings\Application Data\Google\Chrome\User Data\Default\Login Data &#xff08;这个路径是 Win XP 系统&#xff09; 你可以用 SQLite Database Browse…

全程软件测试之测试需求分析与计划(2)

2.3 测试工作量估算 在确定了测试需求、明确了测试范围之后&#xff0c;就需要明确测试任务&#xff0c;估算测试工作量。基于质量需求和测试的工作量、测试环境、产品发布的设想时间等要求&#xff0c;就可以确定测试进度和所需的测试资源&#xff0c;或者基于现有的测试资源…

C语言和Java 在用数组作为参数时有点不一样

C语言和Java 在用数组作为参数时有点不一样。 C中 void jh(int n[2]) {/注意这里参数是写了大小 int temp; temp n[0]; n[0] n[1]; n[1] temp; } int main() { int i; int num[2] {7, 8}; jh(num); } Java中 由于C和Java中定义数组形式稍微有点不一样&#xff0c;所以这里…

[CLR via C#]16. 数组

数组是允许将多个数据项当作一个集合来处理的机制。CLR支持一维数组、多维数组和交错数据(即由数组构成的数组)。所有数组类型都隐式地从System.Array抽象类派生&#xff0c;后者又派生自System.Object。这意味着数组始终是引用类型&#xff0c;是在托管堆上分配的。在你应用程…