2012-05-19 94 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對象都是不必要的。
相關問題