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