2012-05-19 59 views
-4

有人可以帮我优化这段代码吗?有什么办法可以改进这个Java代码?

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来提高函数的实时性。

+0

您是否尝试过分析代码? – NPE

+6

如果您想优化此代码,请获取一个分析器并自行完成。如果您想要查看代码,请尝试http://codereview.stackexchange.com/ – amaidment

+0

如果您尚未描述外部功能,我们如何提出建议?说,getNewDbValue()是做什么的?它访问数据库吗?一次检索一个值是非常低效的。一次检索它们(50000并不是那么多)。 –

回答

1

使用ArrayList而不是LinkedList。作为拇指规则,向量(如Java的ArrayList)容器将优于链表(如LinkedList)。就内存大小而言,这总是正确的,因为向量容器不会为管家数据强加每个元素开销。在大多数情况下,时间性能也会更好,因为更好的参考位置和更小的内存大小(因此需要更少的昂贵内存访问)。链接列表容器在速度方面的性能可能优于矢量容器,只有在数据中有多个元素的添加和删除时。请注意,参考改进的地点可能不像Java那样明显,因为它们是例如在C++中当容器存储对象时,因为这些都是通过指针间接访问的。

在你的情况下,所有判定标准指向使用矢量容器(ArrayList)。您事先知道容器的大小,不要在容器的中间添加元素,并且存储Double值,编译器可以在容器中将其存储为double double。

+0

Thankz dis似乎是合理的......并赞赏你的解释先生,只有一个小问题可以通过调用函数路径使用arraylist? – JavaBlood

+0

只将LinkedList更改为ArrayList。保留其他List参考。 –

+0

赦免,但使用ArrayList而不是LinkedList时,它充满了自动装箱和50000无用的日历就像在森林中只看到一棵树 – evernat

2

我没有把你的代码的性能放在测试上。但是,我在给出的代码中看到以下问题。

  1. 按照Java编码约定,每个方法名称应该以小写字母开头。所以你应该将你的方法Imprve重命名为improve
  2. 您已在for循环中创建了locMyCalendar a Calendar实例。从这个例子中你只能读到Year属性。这完全没有必要。你应该从这个地方删除这条线。并放在某个地方。这也是一个表现。
  3. locTempVal的空检查不是必需的。作为,doOperation方法返回intint是不太可能是一个null值。
  4. 对于locResult和locTempVal的类型,使用“int”而不是“Integer”,因为每次创建Integer对象都是不必要的。
相关问题