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

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次呢

相关推荐

    if跟switch的区别

    ### if与switch的区别 在程序设计中,`if`与`switch`是非常常见的两种选择结构。...综上所述,`if` 和 `switch` 在使用时各有优势和限制。开发者应根据实际需求和上下文来选择最适合的条件判断结构。

    Java逻辑基础题2-if和switch答案.docx

    在Java逻辑基础题中,if和switch语句是控制流程的重要组成部分,用于实现条件判断和多分支选择。 1. 题目1:考察了字符串常量的比较。在Java中,用"=="比较字符串时,实际上是比较两个对象的引用是否相同,而不是...

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

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

    JavaScript中if与case比较

    JavaScript提供了多种方式来处理条件逻辑,其中最常用的两种是`if`语句和`switch-case`语句。本文将深入探讨这两种结构的特点、应用场景以及它们之间的性能差异。 #### if语句详解 `if`语句是JavaScript中最基本的...

    javascript中if和switch,==和===详解

    总的来说,`if` 和 `switch` 在处理条件逻辑时各有优势,`===` 提供了更严格的比较,有助于减少潜在的错误。在编写JavaScript时,了解这些概念并选择合适的方式可以提高代码的清晰度和可靠性。记住,代码的可读性...

    android switch 开关按钮

    - 考虑到性能和用户体验,避免在`onCheckedChangeListener`回调中执行耗时操作,因为这可能导致UI线程阻塞,造成应用卡顿。如果需要进行复杂操作,建议使用异步任务或`Handler`。 7. **无障碍访问** - 不要忘记为...

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

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

    用开源项目实现自定义switch

    在实际应用中,确保在各种设备和Android版本上测试自定义Switch的行为,确保其兼容性和稳定性。同时,关注性能,避免过度自定义导致的资源浪费。 总之,通过选择合适的开源项目,结合自身的定制需求,我们可以轻松...

    3.3 用switch实现选择结构(ppt).zip

    在编程语言中,选择结构是控制程序流程的关键部分,它允许根据特定条件执行不同的代码块。本主题聚焦于使用`switch`语句来构建选择结构,这是许多...通过熟练掌握`switch`,开发者可以编写出更易维护、性能更好的代码。

    在ListView中嵌套Switch开关,点击ListView条目来切换Switch的状态

    在Android开发中,...注意,为了优化性能,通常会使用ViewHolder模式来避免频繁地查找视图,同时在`getView()`中适当地复用convertView。此外,如果数据源较大,考虑使用异步加载或分页加载技术来提高用户体验。

    7enum和switch语句联合案例分析VC共6页.pdf

    分析还可能涉及如何优化`enum`和`switch`的使用,以提高代码的可维护性和性能。 此外,"赚钱项目"这个文件名可能暗示了案例分析中包含了一个实际的商业应用示例,可能是关于如何利用`enum`和`switch`设计一个盈利...

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

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

    if语句的优化

    随着软件工程的发展和技术的进步,优化`if`语句成为了提高程序性能、减少资源消耗以及提升代码可读性和可维护性的重要手段。本文将深入探讨`if`语句的优化技巧及其应用场景。 #### 一、使用三元运算符简化代码 ...

    android4.0switch源码

    通过研究`android4.0 switch`源码,开发者不仅可以理解`Switch`的基本工作原理,还能学习到如何进行UI组件的自定义和性能优化,这对于提升Android应用的用户体验至关重要。在`SwitchDemo`项目中,开发者可以找到实际...

    php中switch与ifelse的效率区别及适用情况分析

    值得注意的是,if-else和switch语句的选择并不仅仅局限于性能的考虑,还包括代码的可读性和可维护性。在某些情况下,使用switch语句可以让代码更加清晰明了,尤其是在处理具有明确分类或等级制度的场景中。而在需要...

    vlanif三层交换机实现不同网络通信

    这种架构在企业网络、数据中心和大型园区网络中非常常见,因为它能够有效地管理网络资源,同时提供良好的性能和安全性。 VLANIF技术的应用不仅限于简单的VLAN间通信,还可以与其他网络技术结合,如NAT(网络地址...

    java学习资料-switch基础介绍及具体使用方法

    Java中的switch语句是一种多路分支的选择流程控制结构,它提供了比if-else语句更为简洁的代码形式,尤其在处理多个等值判断...在实际开发中,需要根据具体情况选择使用switch还是if-else,以达到最佳的代码质量和性能。

    JavaScript语言精粹(高清电子版)和高性能JavaScript 双语版

    1. **基础语法**:包括变量、数据类型、运算符、流程控制语句(如if-else、switch、for循环和while循环)以及函数定义和调用。 2. **作用域和闭包**:讲解了如何管理变量的作用域,以及闭包如何为JavaScript提供...

Global site tag (gtag.js) - Google Analytics