java+;提高性能和可扩展性

java+;提高性能和可扩展性,java,performance,Java,Performance,下面是一段代码片段,它返回类的对象。现在,对象基本上与循环中的某个参数进行比较 我关心的是,如果循环中有数千个对象,那么性能和可伸缩性可能会成为一个问题。请建议如何改进此代码的性能部分 public Widget get(String name,int major,int minor,boolean exact) { Widget widgetToReturn = null; if(exact) { Widget w = new Widget(name, major,

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

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

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;

}这些小部件不在按名称键入的地图中……为什么

Map<String, List<Widget>> widgetMap;
Map-widgetMap;
您可能需要维护一个
映射,而不是一组简单的小部件。与当前版本的
O(N)
查找相比,这将为您提供
O(1)
(对于哈希映射)或
O(logN)
(对于树映射)查找

(实际上,您可能需要两张地图,或者一张地图>,甚至更复杂的东西。我不太清楚您的精确/不精确匹配应该做什么,这还取决于一个给定小部件的实际版本。)

此外,你的“确切”案例的逻辑似乎被打破了。您正在创建一个小部件,查看现有小部件集,然后:

  • 如果找到匹配项,则返回刚刚创建的小部件。。。(那么为什么要费心查找呢??)
  • 如果未找到匹配项,则返回
    null

我认为威尔的问题是第一个要问的问题-为什么要将小部件保存在一个没有效率的数据结构中

如果您使用这样的结构:

Map<String, Map<WidgetVersion,Widget>> widgetMap;
Map-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;
}
公共小部件get(字符串名、int-major、int-minor、布尔精确) { Widget widgetToReturn=null; Map-widgetVersionMap=widgetMap.get(名称); WidgetVersion WidgetVersion=新的WidgetVersion(主要版本、次要版本); widgetToReturn=widgetVersionMap.get(widgetVersion); if(widgetToReturn==null&&exact==false) { //使用JDK1.5版本的for循环 for(条目:widgetVersionMap.entrySet()) { WidgetVersion wv=entry.getKey(); if(major==wv.getMajor()&&WidgetVersion.isCompatibleAndNewer(wv,WidgetVersion)) { widgetToReturn=entry.getValue(); } } } 返回widgetToReturn; }

这样,对于精确搜索,您有一个O(1)搜索时间,对于不精确搜索,您有O(K)其中K是一个小部件的版本数。

映射必须指向另一个集合,以容纳多个同名小部件。记住优化的最重要规则——在进行优化之前,必须有性能要求,并且不能满足这些要求——否则,请使用可读性最高的代码!您需要改进多少才能满足要求?