zoukankan      html  css  js  c++  java
  • if vs. switch,测试与分析

    记得在很久以前,博客园上一个哥们抱怨.net的源码写的太烂,到处都是switch,我当时就做过一个测试,证实了switch比if性能高许多。今天又看见这个话题,呵呵,那就再做个测试吧。

    代码:

    Code

    release下编译,测试结果:

    TestIfElse: 613
    TestSwitch: 165

    4倍左右的性能差距。反编译看il,会发现TestSwitch方法中多了这么一句:

    switch (L_0032, L_0038, L_003e, L_0044, L_004a)

    这句话实现了一个 jump table。

    正如一线工作者 所言,这个switch 指令是一个有索引的跳转,而if ... else 是无索引的跳转。if...else 是 O(N)级别的,switch ... case 是 O(1)级别的。

    如果将上面测试代码的分支增加到10支,测试TestSwitch(10)与TestIfElse(10)的性能,会发现前者比后者几乎快7-8倍。

    详细解释请参见《深入理解计算机系统》一书中的某章(忘了哪个章节,书不在身边,里面讲了switch和if的区别)。也可参考这篇文章:http://www.9php.com/FAQ/cxsjl/c/2008/10/1435098132356.html。.net下的分析见:http://www.cnblogs.com/yeah/archive/2009/02/16/1392094.html

    如果switch(String ..),测试了一下,switch与if...else性能相当。我原以为为是无法生成跳转表,刚看完http://www.cnblogs.com/yeah/archive/2009/02/16/1392094.html这篇文章,发现还是可以生成跳转表,只是这个跳转表的代价比简单的整数类型的跳转表代价高。也就是说,这种情况下,switch case 还是O(1)级别分支语句的。

    版权所有,欢迎转载
  • 相关阅读:
    Powershell数据处理
    Powershell About Active Directory Group Membership of a domain user
    Powershell About Active Directory Server
    Oracle Schema Objects——Tables——TableStorage
    Oracle Schema Objects——Tables——TableType
    English Grammar
    Oracle Database Documentation
    Oracle Schema Objects——Tables——Oracle Data Types
    Oracle Schema Objects——Tables——Overview of Tables
    What is Grammar?
  • 原文地址:https://www.cnblogs.com/xiaotie/p/1392098.html
Copyright © 2011-2022 走看看