【问题标题】:Effect of Generics on the execution time泛型对执行时间的影响
【发布时间】:2014-05-03 18:50:45
【问题描述】:

我有一个类,它从数据库中获取数据并发送到 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>>();**

这些是剩余的集合使用

【问题讨论】:

  • List 或 List 将是相同的东西 (List -> List)
  • 泛型对执行时间没有影响。你有基准测试结果来证明你的观点吗?
  • 就像我说的那样,在添加 List listOfCLI =new ArrayList(); 代替 List listOfCLI =new ArrayList(); 后执行时间增加到 27 秒;我现在正在运行它......正如我们所说的
  • 你用什么JVM来执行代码?
  • 这不是一个好的基准,因为它包含太多的sout,这些sout会伪造您真正想要测量的内容。

标签: java performance collections arraylist hashmap


【解决方案1】:

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

【讨论】:

  • 数据库命中会产生多少开销?从 JAVA 到 Oracle。
【解决方案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 之类的批处理操作而不是循环应该可以消除这种开销。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2016-09-17
    相关资源
    最近更新 更多