タイプ object と data の 2 つのリストがあります。1 つ目はプリンシパル エンティティで、2 つ目は依存エンティティです。さらに、プリンシパルと依存エンティティ オブジェクトを関連付けるキー テーブルがあります。最初の for ステートメントでは、タイプ オブジェクトのインスタンスを 1 つ取得し、次に、2 番目のエンティティのすべてのインスタンスをループして、それらの間の Match を見つけようとします (指数関数的な問題だと思います…)。一致が見つかった場合は、プリンシパル エンティティを参照オブジェクト。
次のコードは機能していますが、パフォーマンスの観点からチェックしたところ、効率的に機能していません。
perforce の側面からこのコードを改善する方法についてのアイデア/ヒントはありますか。
EntityDataCreator.getInstanceValue
JVMモニターで、問題があることがわかりました。
これがメソッドの開始です
// 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;
}