有没有办法改进这个Java代码?

时间:2012-05-19 09:44:29

标签: java performance function finance

有人可以帮助我优化此代码吗?

public final List<Double> Imprve() {    
List<Double> locDbValueList = new LinkedList<Double> ();
    for (int i = 0; i < 50000; ++i) {
     Calendar locMyCalendar = new GregorianCalendar ();
      locDbValueList.add(getNewDbValue(locMyCalendar.get(Calendar.YEAR), i));
}
    updateList(locDbValueList) ;    
    Integer locResult = 0 ;
    for (int i = 0; i < locDbValueList.size(); ++i) {
      final Integer locTempVal = doOperation(locDbValueList.get(i));
      if (locTempVal != null) {
        locResult += locTempVal;
      }
    }
    applyResult(locResult) ;
    return locDbValueList;
}

private Double getNewDbValue(int parYear, int parIdx) { … }
private void updateList(List<Double> valList) { … }   //Modifies value not size
private int doOperation (Double parDbRefValue) { … }
private void applyResult (int parIntValue) { … }*  

我想修改类Imprve以提高函数的及时性。

2 个答案:

答案 0 :(得分:2)

我没有将您的代码的性能用于测试。但是,我确实在给出的代码中看到了以下问题。

  1. 根据Java编码约定,每个方法名称都应以小写字母开头。因此,您应该将方法Imprve重命名为improve
  2. 您已在for循环中创建了locMyCalendar Calendar个实例。从这个实例中,您只读取Year属性。这是完全没必要的。你应该从这个地方删除这一行。放在某处。这也是一次性能打击。
  3. 不需要locTempVal的空检查。因为,doOperation方法返回int,而int不太可能是null值。
  4. 使用“int”而不是“Integer”作为locResult和locTempVal的类型,因为每次都不需要创建Integer对象。

答案 1 :(得分:1)

使用ArrayList而不是LinkedList。

作为一个经验法则,矢量(如Java的ArrayList)容器将胜过链表(如LinkedList)。这在内存大小方面总是如此,因为向量容器不会对内务处理数据施加每元素开销。在大多数情况下,由于更好的参考局部性和更小的存储器大小(因此需要更少的昂贵的存储器访问),时间性能也将更好。只有在数据中有许多元素的添加和删除时,链接列表容器的速度才能超过矢量容器。请注意,参考改进的位置在Java中可能不像它们那样明显。在C ++中,当容器存储对象时,因为它们无论如何都是通过指针间接访问的。

在您的情况下,所有决策标准都指向使用向量容器(ArrayList)。您事先知道容器的大小,不要在容器的中间添加元素,并且存储Double值,编译器可以将它们存储为容器中的双精度值。