java - 代码的性能问题,指数工作

标签 java performance algorithm

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

以下代码有效,但我从性能角度对其进行了检查,但没有以有效的方式工作。

您是否有想法/提示如何从 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;
    }

最佳答案

我猜你最好的选择是遍历两个列表一次,在哈希表中准备你需要的所有数据,然后进行一次迭代。这样,你的问题就变成了 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 做同样的事情 - 这样,您的搜索会快得多。

关于java - 代码的性能问题,指数工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16140962/

相关文章:

algorithm - CPLEX 提供具有不同目标值的不同最佳解决方案

algorithm - 在二维网格上创建随机形式

java - 什么是NullPointerException,我该如何解决?

java - 如何在android中的后台服务中获取当前位置

java - 使用接口(interface)实现所有 Activity 的代码

java - 使用 20 M 记录的 Lucene 索引需要更多时间

android - AndroidMediaLibary 的替代品

java - 安装 javafx native build 时执行批处理文件

html - spriting 对于高流量网站的性能有多重要?

algorithm - 编辑距离算法解释