-5

有人可以帮我优化这段代码吗?

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 以提高功能的及时性。

4

2 回答 2

2

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

  1. 根据 Java 编码约定,每个方法名称都应以小写字母开头。所以你应该将你的方法重命名Imprveimprove.
  2. 您已经在 for 循环中创建locMyCalendar了一个实例。Calendar在这种情况下,您是只读Year属性。这是完全没有必要的。你应该从这个地方删除这条线。并且把它放在某个地方。这也是一个性能打击。
  3. locTempVal不需要对 进行空检查。因为,doOperation方法返回int并且int不太可能是一个null值。
  4. 并且对于 locResult 和 locTempVal 的类型使用“int”而不是“Integer”,因为每次都不需要创建 Integer 对象。
于 2012-05-19T10:30:01.350 回答
1

使用 ArrayList 而不是 LinkedList。

根据经验,向量(如 Java 的 ArrayList)容器将优于链表容器(如 LinkedList)。就内存大小而言,这始终是正确的,因为向量容器不会对内务数据施加每个元素的开销。在大多数情况下,时间性能也会更好,因为更好的引用局部性和更小的内存大小(因此需要更少的昂贵内存访问)。仅当您在数据中添加和删除许多元素时,链表容器在速度方面可能优于矢量容器。请注意,当容器存储对象时,引用改进的局部性在 Java 中可能不像在 C++ 中那样明显,因为无论如何这些都是通过指针间接访问的。

在您的情况下,所有决策标准都指向使用向量容器(ArrayList)。你事先知道容器的大小,你不会在容器的中间添加元素,你存储的是 Double 值,编译器可能会将其作为普通的 double 值存储在容器中。

于 2012-05-19T10:04:44.373 回答