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

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

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要差一点,不过它的用途主要不是用来比较这个。。。

你可能感兴趣的:(算法,performance)