0

タイプ object と data の 2 つのリストがあります。1 つ目はプリンシパル エンティティで、2 つ目は依存エンティティです。さらに、プリンシパルと依存エンティティ オブジェクトを関連付けるキー テーブルがあります。最初の for ステートメントでは、タイプ オブジェクトのインスタンスを 1 つ取得し、次に、2 番目のエンティティのすべてのインスタンスをループして、それらの間の Match を見つけようとします (指数関数的な問題だと思います…)。一致が見つかった場合は、プリンシパル エンティティを参照オブジェクト。

次のコードは機能していますが、パフォーマンスの観点からチェックしたところ、効率的に機能していません。

perforce の側面からこのコードを改善する方法についてのアイデア/ヒントはありますか。

EntityDataCreator.getInstanceValueJVMモニターで、問題があることがわかりました。

これがメソッドの開始です

// 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;
    }
4

2 に答える 2

3

私の推測では、両方のリストを 1 回調べて、ハッシュテーブルに必要なすべてのデータを準備してから、1 回の反復を行うのが最善の策です。このようにして、問題は 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 についても同じことを行います。このようにすると、検索がはるかに高速になります。

于 2013-04-22T06:48:16.510 に答える
1

私はあなたの質問を誤解しているかもしれませんが、エンティティのequalsメソッドとそれらのハッシュメソッドを定義することをお勧めします.

可能な限り Java のインフラストラクチャに依存していると思いますが、Sun/Oracle はそれを本当に高速にするために長い時間を費やしました。

于 2013-04-22T06:52:39.607 に答える