代码性能问题,指数工作

时间:2013-04-22 06:44:25

标签: java performance algorithm

我有两个带有数据的类型对象列表,第一个是主体实体,第二个是依赖实体。 另外,我有主表和依赖实体对象之间的关键表。 在第一个for语句中,我得到一个类型为object的实例,然后我继续循环第二个实体的每个实例并尝试查找 它们之间的匹配(我认为是指数问题......),如果匹配则查找使用引用对象更新主体实体。

以下代码正在运行但我从性能角度检查它并且它无法有效地工作。

您是否有想法/提示如何从perforce方面改进此代码。

在JVM监视器中,我发现EntityDataCreator.getInstanceValue有问题。

这是方法开始

// start with the principal entity
        for (Object principalEntityInstance : principalEntityInstances) {

            List<Object> genObject = null;
            Object refObject = createRefObj(dependentMultiplicity);
            // check entries in dependent entity
            for (Object dependentEntityInstance : toEntityInstances) {
                boolean matches = true;

                for (String[] prop : propertiesMappings) {

                    // Get properties related keys
                    String fromProp = prop[0];
                    String toProp = prop[1];

                    Object fromValue = EntityDataCreator.getInstanceValue(fromProp, principalEntityInstance);
                    Object toValue = EntityDataCreator.getInstanceValue(toProp, dependentEntityInstance);

                    if (fromValue != null && toValue != null) {
                        if (!fromValue.equals(toValue)) {

                            matches = false;
                            break;
                        }
                    }
                }

                if (matches) {
                    // all properties match
                    if (refObject instanceof List) {
                        genObject = (List<Object>) refObject;
                        genObject.add(dependentEntityInstance);
                        refObject = genObject;
                    } else {
                        refObject = dependentEntityInstance;
                        break;
                    }
                }
            }

            if (refObject != null) {

                EntityDataCreator.createMemberValue(principalEntityInstance, navigationPropName, refObject);
            }
        }




public static Object getInstanceValue(String Property, Object EntityInstance) throws NoSuchFieldException,
            IllegalAccessException {

        Class<? extends Object> EntityObj = EntityInstance.getClass();
        Field Field = EntityObj.getDeclaredField(Property);
        Field.setAccessible(true);
        Object Value = Field.get(EntityInstance);
        Field.setAccessible(false);
        return Value;
    }

2 个答案:

答案 0 :(得分:3)

我的猜测是你最好的选择是一次浏览两个列表,准备哈希表中需要的所有数据,然后进行一次迭代。这样,你的问题变成N + M而不是N * M


修改

Map<String,List<Object>> principalMap = new HashMap<String,List<Object>>();

for (Object principalEntityInstance : principalEntityInstances) {
   List<String> keys = getKeysFor(principalEntityInstance);
   for(String key : keys) {
       List<Object> l = principalMap.get(key);
       if(l==null) {
           l = new ArrayList<Object>();
           principalMap.put(key,l);
       }
       l.add(principalEntityInstance);
   }
}

对dependentEntityInstance执行相同的操作 - 这样,您的搜索速度会快得多。

答案 1 :(得分:1)

我可能误解了你的问题,但我建议为你的实体定义一个equals方法,并为它们定义一个散列方法,这样你就可以利用java已经拥有的所有优点来搜索和匹配实体。

在我认为可能完全依赖Java的基础架构时,Sun / Oracle花了很长时间才真正做到这一点。