日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 品味性能之道十一: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)??赡苣奶煳倚那楹脮牙胑num優化的代碼給放出來。
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

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的品味性能之道十一:JAVA中switch和if性能比较的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。