2010-06-13 105 views
2

下面是一個代碼片斷,它返回一個類的對象。現在該對象基本上與循環中的某個參數進行比較。java +提高性能和可伸縮性

我擔心如果有成千上萬個對象循環,那麼性能和可伸縮性會成爲問題。請建議如何提高性能部分

public Widget get(String name,int major,int minor,boolean exact) { 
    Widget widgetToReturn = null; 
    if(exact) { 
     Widget w = new Widget(name, major, minor); 

     // for loop using JDK 1.5 version 
     for(Widget wid : set) { 
      if((w.getName().equals(wid.getName())) && (wid.getVersion()).equals(w.getVersion())) { 
       widgetToReturn = w; 
       break; 
      } 
     } 
    } else { 
     Widget w = new Widget(name, major, minor); 
     WidgetVersion widgetVersion = new WidgetVersion(major, minor); 

     // for loop using JDK 1.5 version 
     for(Widget wid : set) { 
      WidgetVersion wv = wid.getVersion(); 
      if((w.getName().equals(wid.getName())) && major == wv.getMajor() && WidgetVersion.isCompatibleAndNewer(wv, widgetVersion)) { 
       widgetToReturn = wid; 
      } else if((w.getName().equals(wid.getName())) && wv.equals(widgetVersion.getMajor(), widgetVersion.getMinor())) { 
       widgetToReturn = w; 
      } 
     } 
    } 
    return widgetToReturn; 

}

+0

記住最重要的優化規則 - 在你做之前你必須有性能要求,你必須沒有滿足這些要求 - 否則使用最可讀的代碼!你需要改進多少才能滿足要求? – 2011-09-19 20:01:41

回答

1

而且這些小部件是不是按名稱鍵控地圖...爲什麼這個代碼?

Map<String, List<Widget>> widgetMap; 
2

而不是小工具的簡單的「設置」,你可能需要保持Map<WidgetVersion, Widget>。這會給你O(1)(用於散列圖)或O(logN)(用於樹圖)查找,與當前版本的O(N)查找相比較。 (你可能實際上需要兩張地圖,或一個Map>甚至更復雜的東西,我不能完全弄清楚你的確切/不精確的匹配應該做什麼,它也取決於給定小部件的多少個版本可能在實踐中)。

此外,您的「確切」情況的邏輯看起來破碎。您正在創建一個小部件,看在組現有的小部件,然後:

  • ,如果你發現你回到你剛纔創建的小部件匹配...
  • (所以爲什麼與查找?打擾)如果您沒有找到匹配項,則返回null
+0

該地圖將不得不指向另一個集合來保存多個相同名稱的小部件。 – Chadwick 2010-06-13 07:38:49

4

我想威爾的問題是要問的第一個問題 - 爲什麼你要把小工具放在一個沒有效率的數據結構中?

如果使用這樣的結構:

Map<String, Map<WidgetVersion,Widget>> widgetMap; 

你可以寫下面的代碼:

public Widget get(String name,int major,int minor,boolean exact) 
{ 
    Widget widgetToReturn = null; 

    Map<WidgetVersion,Widget> widgetVersionMap = widgetMap.get(name); 
    WidgetVersion widgetVersion = new WidgetVersion(major, minor); 
    widgetToReturn = widgetVersionMap.get(widgetVersion); 
    if(widgetToReturn==null && exact==false) 
    { 
     // for loop using JDK 1.5 version 
     for(Entry<WidgetVersion,Widget> entry : widgetVersionMap.entrySet()) 
     { 
      WidgetVersion wv = entry.getKey(); 
      if(major == wv.getMajor() && WidgetVersion.isCompatibleAndNewer(wv, widgetVersion)) 
      { 
       widgetToReturn = entry.getValue(); 
      } 
     } 
    } 
    return widgetToReturn; 
} 

這樣的精確搜索你有一個O(1)搜索時間並沒有 - 完全你有O(K),其中K是小部件所具有的版本的數量。