`
fishermen
  • 浏览: 374422 次
社区版块
存档分类
最新评论

switch和if的性能比较

阅读更多

      一直认为switch的效率高于if,特别对于条件大于3的时候,以前也貌似看过资料说:switch的查找类似二叉树,if的则是线性。

      最近做了一个简单的测试,对有多个条件式的switch和if做比较,发现两者的效率几乎相同,if的效率甚至高于switch;<测试环境sun jdk6.1.13>

     40个条件式的测试,测试1000 0000次,if耗时219ms, switch耗时234ms,平均都在4-5k/s;

     30个条件式的测试,测试1000 0000次,if耗时188 switch耗时172平均都在5-6kw/s,

     20个条件式,测试1000 0000次,if耗时109mswitch耗时125ms,平均在8-9kw/s

 

      总结:

      1 经过jdk的改进,目前switch和if的性能上差别微乎其微

      2 条件式的多少对于一般应用的整体性能来说,影响也非常小。

      3 影响效率的最大因子是条件式的数量,而非if或switch

测试代码

private static void testSitchAndIf(){
  int testCount = 10000000;
  int flag = 0;
  
  Random random = new Random(testCount);
  int[] flags = new int[testCount];
  for(int i = 0; i < testCount; i++){
   flags[i] = random.nextInt() + 1;
  }
  // 先统一取一遍值,保证测试都用缓存值
  for(int i = 0; i < testCount; i++){
   flag = flags[i];
  }
  long time1 = System.currentTimeMillis();
  for(int i = 0; i < testCount; i++){ 
   //flag = random.nextInt() + 1;
   flag = flags[i];
   if(flag == 1){}
   else if(flag == 2){}
   else if(flag == 3){}
   else if(flag == 4){}
   else if(flag == 5){}
   else if(flag == 6){}
   else if(flag == 7){}
   else if(flag == 8){}
   else if(flag == 9){}
   else if(flag == 10){}
   else if(flag == 11){}
   else if(flag == 12){}
   else if(flag == 13){}
   else if(flag == 14){}
   else if(flag == 15){}
   else if(flag == 16){}
   else if(flag == 17){}
   else if(flag == 18){}
   else if(flag == 19){}
   else if(flag == 20){}
   else if(flag == 21){}
   else if(flag == 22){}
   else if(flag == 23){}
   else if(flag == 24){}
   else if(flag == 25){}
   else if(flag == 26){}
   else if(flag == 27){}
   else if(flag == 28){}
   else if(flag == 29){}
   else if(flag == 30){}
//   else if(flag == 31){}
//   else if(flag == 32){}
//   else if(flag == 33){}
//   else if(flag == 34){}
//   else if(flag == 35){}
//   else if(flag == 36){}
//   else if(flag == 37){}
//   else if(flag == 38){}
//   else if(flag == 39){}
//   else if(flag == 40){}   
  }
  
  long time2 = System.currentTimeMillis();  
  for(int i = 0; i < testCount; i++){
   flag = flags[i];
   switch(flag){
    case 1: break;
    case 2: break;
    case 3: break;
    case 4: break;
    case 5: break;
    case 6: break;
    case 7: break;
    case 8: break;
    case 9: break;
    case 10: break;
    case 11: break;
    case 12: break;
    case 13: break;
    case 14: break;
    case 15: break;
    case 16: break;
    case 17: break;
    case 18: break;
    case 19: break;
    case 20: break;
    case 21: break;
    case 22: break;
    case 23: break;
    case 24: break;
    case 25: break;
    case 26: break;
    case 27: break;
    case 28: break;
    case 29: break;
    case 30: break;
//    case 31: break;
//    case 32: break;
//    case 33: break;
//    case 34: break;
//    case 35: break;
//    case 36: break;
//    case 37: break;
//    case 38: break;
//    case 39: break;
//    case 40: break;
//    case 41: break;
   }   
  }
  
  long time3 = System.currentTimeMillis();
  System.out.println("loop count:" + testCount);
  System.out.println("if consume time:" + (time2 - time1) + ",avg:" + testCount / (time2 - time1) * 1000);
  System.out.println("switch consume time:" + (time3 - time2) + ",avg:" + testCount / (time3 - time2) * 1000);
 }

 

 

 

分享到:
评论
2 楼 fishermen 2010-08-27  
循环几十次,可计量时间短,而且样本数量也少,不容易看出实际效果。
1 楼 jarry-li 2010-08-23  
楼主为什么不是循环几十次,if..else 有10 000 000次呢

相关推荐

    阿里巴巴Java性能调优实战(2021-2022华山版)+Java架构核心宝典+性能优化手册100技巧.rar

    阿里巴巴Java性能调优华山版是...If / switch 性能评测 switch 性能优化 JVM 性能优化 MySQL性能优化的 50+ 小技巧 Redis 性能优化的 13 个小技巧 . . . 每篇文章图文并茂,附有源码 + 性能评测结果 + 优化方案。

    Java性能优化手册100技巧 中文PDF最新版

    性能优化手册是一套java性能...If / switch 性能评测 switch 性能优化 JVM 性能优化 MySQL性能优化的 50+ 小技巧 Redis 性能优化的 13 个小技巧 . . . 每篇文章图文并茂,附有源码 + 性能评测结果 + 优化方案。

    C++性能剖析教程之switch语句

    除了用嵌套if语句外,C++中还提供switch语句,又称为“开关语句”,用来实现多分支(多选一),下面这篇文章主要给大家介绍了关于C++性能剖析教程之switch语句的相关资料,需要的朋友可以参考下

    cc++程序员面试宝典-switch语句

    内容涵盖了switch语句的定义、基本语法、使用场景、优点、注意事项、与if语句的区别、实战应用、多重分支、范围检查、字符串处理、默认情况、性能考虑、灵活性、多态性、安全性、调试、性能优化和最佳实践等高级知识...

    Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程

    在Angular的原生指令中有这几个指令用来控制元素的展示与否,ng-show/ng-hide/ng-if和ng-switch。在angular性能优化中,我们也常常会用到它。这篇文章主要给大家介绍了在Angular.JS中指令ng-if、ng-show/ng-hide和ng...

    switch:缺少的Python switch语句

    from switch import Switchdef simple_example ( val ): values = [] with Switch ( val ) as case : if case ( 1 ): values . append ( 'Found 1' ) if case ( 2 , 3 ): values . append ( 'Found 2 or 3' ) ...

    CUDA——性能优化(一)

    会有400-600个时钟周期的内存延迟,这个代价很昂贵,所以为了减少访问全局内存的指令次数,我们将满足字节大小和对齐要求的warp合并起来访问全局内存,从而减少对全局内存的访问次数,提高GPU性能。 关于warp指令...

    关于单片机按键问题性能提升总结

    最近看了一本书《8051单片机创新教程》,这本书比大学课本写得好,在大学的课本中,我们常见的按键扫描程序如下: ... switch(KEY_IO) { case 0xFE: KeyValue=1;break; case 0xFD: KeyValue=2;break

    管理论文:企业DHCP服务器配置与管理.doc

    if)#exit Switch(config)#int f0/2 //配置端口F0/2,把该端口加入vlan10 Switch(config-if)#switchitchport mode access Switch(config-if)#switchitchport access vlan 10 Switch(config-if)#exit 同理,

    MATLAB程序设计实验.doc

    " " "编写程序演示控制结构的用法: " " "编写程序分别来演示循环(for、while)、分支(if-else-end " " "、switch-case)和异常处理(try-catch)控制结构的用法。 " " "3.编写程序分别演示以下命令的功能。...

    什么是VLAN

     对VLAN的标准,我们只是介绍两种比较通用的标准,当然也有一些公司具有自己的标准,比如Cisco公司的ISL标准,虽然不是一种大众化的标准,但是由于Cisco Catalyst交换机的大量使用,ISL也成为一种不是标准的标准了...

    Java面试题合集最新版2024.zip

    控制流语句:熟悉if-else、switch、for、while等控制流语句的用法。 面向对象编程:深入理解Java中的类、对象、继承、封装和多态等概念。 异常处理:了解try-catch-finally块的使用,以及自定义异常的处理。 二、...

    微软内部资料-SQL性能优化2

    A 32-bit process is normally limited to addressing 2 gigabytes (GB) of memory, or 3 GB if the system was booted using the /3G boot switch even if there is more physical memory available. By leveraging...

    微软内部资料-SQL性能优化3

    In our example, if one transaction (T1) holds an exclusive lock at the table level, and another transaction (T2) holds an exclusive lock at the row level, each of the transactions believe they have ...

    javascript两段代码,两个小技巧

    于是我就写成||&&形式的, 后来测试性能的时候,发现性能竟然上了一个数量级,可见这种写法在某些情况下可以增加性能,但是我并不确定是何种情况才能提高性能,因为我测试在通常情况下switch和||&&的性能是差不多的....

    Swift编程入门指南.docx

    Swift是一种支持多编程范式和编译式的开源编程语言,由苹果公司于2014年在WWDC(苹果开发者大会)上发布...控制流:Swift提供了各种控制流结构,如if语句、switch语句、for循环和while循环等,用于控制程序的执行流程。

    C语言代码优化 方案

    1、选择合适的算法和数据结构 2、使用尽量小的数据类型 3、减少运算的强度 (1)查表 (2)求余运算 (3)平方运算 (4)用移位实现乘除法运算 (5)避免不必要的整数除法 ...11、使用嵌套的if结构

    freemarker语法完整版

    用来压缩空白空间和空白的行 escape, noescape 语法 Freemarker代码 &lt;#escape identifier as expression&gt; ... &lt;#noescape&gt;...&lt;/#noescape&gt; ... &lt;/#escape&gt; ... &lt;#noescape&gt;... ... 用例 ...

    Java 基础核心总结 +经典算法大全.rar

    if...else 条件语句if...else if 多分支语句switch 多分支语句 循环语句 while 循环语句do...while 循环for 循环语句 跳转语句 break 语句 continue 语句面向对象 类也是-种对象对象的创建 属性和方法 构造方法 方法...

Global site tag (gtag.js) - Google Analytics