java +提高性能和可扩展性

时间:2010-06-13 04:50:56

标签: java performance

下面的

是一个代码片段,它返回一个类的对象。现在,该对象基本上与循环中的某些参数进行比较。

我担心的是如果循环中有数千个对象,那么性能和可伸缩性可能是个问题。请建议如何改进性能部分的代码

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;

}

3 个答案:

答案 0 :(得分:4)

我认为Will的问题是第一个要问的问题 - 你为什么要在一个无效的数据结构中持有Widgets?

如果你使用这样的结构:

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是窗口小部件的版本数。

答案 1 :(得分:2)

您可能需要维护Map<WidgetVersion, Widget>,而不是简单的“小工具集”。与当前版本的O(1)查找相比,这将为您提供O(logN)(对于哈希映射)或O(N)(对于树图)查找。

(你可能实际上需要两张地图,或一张地图&gt;甚至更复杂的东西。我无法弄清楚你的确切/不精确匹配应该做什么,而且还取决于给定小部件的版本数量是多少可能在实践中。)

此外,你的“确切”案例的逻辑看起来很破碎。您正在创建一个窗口小部件,查看现有窗口小部件集,然后:

  • 如果找到匹配项,则返回刚刚创建的小部件...(那么为什么还要查找?)
  • 如果找不到匹配项,则返回null

答案 2 :(得分:1)

这些小部件不在名称中的地图中......为什么?

Map<String, List<Widget>> widgetMap;