`
Ben.Sin
  • 浏览: 229400 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

If..else, Map, Enum查询速度对比

    博客分类:
  • Java
阅读更多

习惯每天逛一下论坛,今天发现一个关于重构的帖子

http://www.iteye.com/topic/940121

 

 

于是特地自己做了一个测试,排除异常的情况,测试代码如下

 

package ben.test.performance.ifelse;  
  
import java.util.HashMap;  
import java.util.Map;  
  
public class MapIfEnum {  
    public static final String HK = "HK";  
    public static final String MACAO = "MC";  
    public static final String TW = "TW";  
    public static final String OTHER = "OTHER";  
      
    public static void main(String[] args){  
//      String code = HK;  
//      String code = MACAO;  
//      String code = TW;  
        String code = OTHER;  
        MapIfEnum test = new MapIfEnum();  
        long start = 0L + System.currentTimeMillis();  
        for (int i = 0; i < 1000000; i ++){  
            test.useIfElse(code);  
//          test.useEnum(code);  
//          test.useMap(code);  
        }  
        long end = 0L + System.currentTimeMillis();  
        System.out.println("Used time = " + (end - start));  
    }  
      
    public String useIfElse(String code){  
        if (HK.equals(code)){  
            return "中国香港";  
        } else if (MACAO.equals(code)){  
            return "中国澳门";  
        } else if (TW.equals(code)){  
            return "中国台湾";  
        } else {  
            return "其他地区";  
        }  
    }  
      
    public String useEnum(String code){  
        return Area.valueOf(code).getDesc();  
    }  
      
    public String useMap(String code){  
        return areaMap.get(code);  
    }  
      
    enum Area{  
        HK("中国香港"),  
        MC("中国澳门"),  
        TW("中国台湾"),  
        OTHER("其他地区");  
          
        private String desc;  
          
        private Area(String desc){  
            this.desc = desc;  
        }  
          
        public String getDesc(){  
            return desc;  
        }  
    }  
      
    public static Map<String, String> areaMap = new HashMap<String, String>();  
    static {  
        areaMap.put("HK", "中国香港");  
        areaMap.put("MC", "中国澳门");  
        areaMap.put("TW", "中国台湾");  
        areaMap.put("OTHER", "其他地区");  
    }  
}  

 

做了1,000,000次的循环,最后得到结果大致如下

if..else  首次命中最快15ms, 第二次命中和Map相当23ms,第三此比Enum稍微快一点31ms

Map      基本保持在24ms左右,因为hash code算法的关系每次都几乎一样

Enum    在本次测试中最慢,每次都是大约36ms左右

 

可见如果1~2次的比较,if..else显然最合适,

但如果比较次数超过3次以上HashMap最为理想

Enum显然要比Map要差一点,不过它的用途主要不是用来比较这个。。。

分享到:
评论

相关推荐

    Thinking in Java 4th Edition

    if-else .................................. 93 Iteration ............................... 94 do-while ..................................... 95 for ................................................ 95 The...

    android折线图

    035 public static enum Mstyle 036 { 037 Line,Curve 038 } 039 040 private Mstyle mstyle=Mstyle.Line; 041 private Point[] mPoints = new Point[100]; 042 043 Context context; ...

    python3.6.5参考手册 chm

    enum faulthandler fileinput hashlib http.client idlelib and IDLE importlib inspect json logging math multiprocessing os pathlib pdb pickle pickletools pydoc random re readline ...

    swift-enum-properties:uc结构和枚举数据访问协调一致

    :handshake: swift-enum-properties 结构和枚举数据访问协调一致。 动机 在Swift中,默认情况下,结构数据访问要比枚举数据访问更符合人体工程学。 使用表达点句法,可以在不到一行的范围内访问struct字段: user...

    词法分析器

    else if(i==1) isfind = 4; else isfind = 5; break; } if(isfind==0) { int isnum = temp[0]-'0'; if(isnum&gt;-1||isnum) isfind = 3; else isfind = 2; } ...

    基于sniffer做的一个抓包监控软件

    enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ...

    Google C++ Style Guide(Google C++编程规范)高清PDF

    If an inline function definition is short, with very little, if any, logic in it, you should put the code in your .h file. For example, accessors and mutators should certainly be inside a class ...

    stdafx.h代码

    stdafx.h的代码// This is a part of the Microsoft Foundation Classes C++ library. ...// All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Foundation Classes ...

    MFC与IP多播技术的局域网聊天器网络课程设计

    enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ...

    多小球碰撞

    enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ...

    简易的播放器

    enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : ...

    显示我的文档路径

    enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ...

    vc++ADOX创建数据库

    enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ...

    VC++访问ACCESS数据库

    enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ...

    C++实现56dxw短信验证码WebService接口--

    -t 文件名,指定type map文件,默认为typemap.dat -e 禁止为enum成员加上名空间前缀 -C 仅生成客户端代码 -S 仅生成服务器端代码 -L 不要产生soapClientLib.c和soapServerLib.c文件 -c 产生纯C代码,否则是C++代码...

    手机图片浏览器

    enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ...

    数字识别之神经网络法

    enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ...

    VC编写的聊天程序

    enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ...

    Hibernate注释大全收藏

    @TemporalType.(DATE,TIME,TIMESTAMP) 分别Map java.sql.(Date, Time, Timestamp). @Lob 注解属性将被持久化为 Blog 或 Clob 类型。具体的java.sql.Clob, Character[], char[] 和 java.lang.String 将被持久化为 ...

    c++播放器代码

    enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ...

Global site tag (gtag.js) - Google Analytics