[英]java + increasing performance and scalability
下面是一个代码片段,它返回一个类的对象。 现在,对象正在与循环中的某些参数进行基础比较。
我担心的是,如果有成千上万的对象在循环中,那么在这种情况下,性能和可伸缩性就会成为问题。 请提出如何改进此代码的性能部分
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;
}
我认为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是小部件具有的版本数。
您可能需要维护Map<WidgetVersion, Widget>
而不是简单的Widget“集合”。 与当前版本的O(N)
查找相比,这将为您提供O(1)
(对于哈希映射)或O(logN)
(对于树映射)查找。
(您实际上可能需要两张地图,或者一个Map>甚至更复杂的东西。我无法完全弄清楚您应该执行的精确/不精确匹配,这还取决于实际中给定小部件的多少版本。)
另外,“精确”案例的逻辑看起来很混乱。 您正在创建一个小部件,查看现有小部件的集合,然后:
null
。 而且这些小部件不在以名称为键的地图中...为什么?
Map<String, List<Widget>> widgetMap;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.