泛型对执行时间的影响

时间:2014-03-25 18:08:35

标签: java performance collections arraylist hashmap

我有一个类从数据库中获取数据并发送到UI以生成图表。

班级的执行时间为14秒

    List listOfCLI =new ArrayList();
List listOfRRV =new ArrayList();
List listOfROP =new ArrayList();
List listOfACR =new ArrayList();
List listOfPIN =new ArrayList();
List listOfRIS =new ArrayList();
List listOfTAA =new ArrayList();
List listOfTAR =new ArrayList();
List listOfPHA =new ArrayList();
List listOfSAR =new ArrayList();
List listOfGRQ =new ArrayList();
List listOfADC =new ArrayList();

当我将代码更改为

 List<DataMS> listOfCLI =new ArrayList<DataMS>();
List<DataMS> listOfRRV =new ArrayList<DataMS>();
List<DataMS> listOfROP =new ArrayList<DataMS>();
List<DataMS> listOfACR =new ArrayList<DataMS>();
List<DataMS> listOfPIN =new ArrayList<DataMS>();
List<DataMS> listOfRIS =new ArrayList<DataMS>();
List<DataMS> listOfTAA =new ArrayList<DataMS>();
List<DataMS> listOfTAR =new ArrayList<DataMS>();
List<DataMS> listOfPHA =new ArrayList<DataMS>();
List<DataMS> listOfSAR =new ArrayList<DataMS>();
List<DataMS> listOfGRQ =new ArrayList<DataMS>();
List<DataMS> listOfADC =new ArrayList<DataMS>();

执行时间最长为17秒.. 为什么eclipse建议添加Generic会产生这样的负面影响。

您也可以建议使用泛型来减少执行时间的最佳方式

**Map<String, List> reqCLI =new HashMap<String, List>();
        Map<String, List> reqRRV =new HashMap<String, List>();
        Map<String, List> reqROP =new HashMap<String, List>();
        Map<String, List> reqACR =new HashMap<String, List>();
        Map<String, List> reqPIN =new HashMap<String, List>();
        Map<String, List> reqTAA =new HashMap<String, List>();
        Map<String, List> reqTAR =new HashMap<String, List>();
        Map<String, List> reqRIS =new HashMap<String, List>();
        Map<String, List> reqPHA =new HashMap<String, List>();
        Map<String, List> reqSAR =new HashMap<String, List>();
        Map<String, List> reqGRQ =new HashMap<String, List>();
        Map<String, List> reqADC =new HashMap<String, List>();

        List<Map<String, List>> listCLI=new ArrayList<Map<String, List>>();
        List<Map<String, List>> listRRV=new ArrayList<Map<String, List>>();
        List<Map<String, List>> listROP=new ArrayList<Map<String, List>>();
        List<Map<String, List>> listACR=new ArrayList<Map<String, List>>();
        List<Map<String, List>> listPIN=new ArrayList<Map<String, List>>();
        List<Map<String, List>> listTAA=new ArrayList<Map<String, List>>();
        List<Map<String, List>> listTAR=new ArrayList<Map<String, List>>();
        List<Map<String, List>> listRIS=new ArrayList<Map<String, List>>();
        List<Map<String, List>> listPHA=new ArrayList<Map<String, List>>();
        List<Map<String, List>> listSAR=new ArrayList<Map<String, List>>();
        List<Map<String, List>> listGRQ=new ArrayList<Map<String, List>>();
        List<Map<String, List>> listADC=new ArrayList<Map<String, List>>();**

这些是使用的剩余集合

2 个答案:

答案 0 :(得分:2)

由于类型擦除(请参阅http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ101),泛型类型未在编译的字节码中表示,因此执行时的性能应该没有差异。参数化类型仅在编译时检查。

答案 1 :(得分:2)

唯一的区别是java编译器可以插入隐式强制转换

List a = new ArrayList();
b.add("foo");
List b = new ArrayList();
for (Object o : a) {
  b.add(o);  // Adding an object.
}

没有演员表,但

中有隐式演员表
List<String> a = new ArrayList<String>();
b.add("foo");
List<String> b = new ArrayList<String>();
// Each element is implicitly cast to a String which requires
// a runtime type check.
for (String s : a) {
  b.add(s);
}

这是字节码级别的唯一区别。

如果不知道你正在做的写入和读取次数,但是RTTI检查相当便宜,很难说这是否会导致你看到的差异。


如果那是罪魁祸首,首选批量操作(如List.addAllMap.putAll而不是循环应该可以消除这种开销。