有人可以帮助我优化此代码吗?
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 :(得分:2)
我没有将您的代码的性能用于测试。但是,我确实在给出的代码中看到了以下问题。
Imprve
重命名为improve
。locMyCalendar
Calendar
个实例。从这个实例中,您只读取Year
属性。这是完全没必要的。你应该从这个地方删除这一行。放在某处。这也是一次性能打击。locTempVal
的空检查。因为,doOperation
方法返回int
,而int
不太可能是null
值。答案 1 :(得分:1)
使用ArrayList而不是LinkedList。
作为一个经验法则,矢量(如Java的ArrayList)容器将胜过链表(如LinkedList)。这在内存大小方面总是如此,因为向量容器不会对内务处理数据施加每元素开销。在大多数情况下,由于更好的参考局部性和更小的存储器大小(因此需要更少的昂贵的存储器访问),时间性能也将更好。只有在数据中有许多元素的添加和删除时,链接列表容器的速度才能超过矢量容器。请注意,参考改进的位置在Java中可能不像它们那样明显。在C ++中,当容器存储对象时,因为它们无论如何都是通过指针间接访问的。
在您的情况下,所有决策标准都指向使用向量容器(ArrayList)。您事先知道容器的大小,不要在容器的中间添加元素,并且存储Double值,编译器可以将它们存储为容器中的双精度值。