问题描述
我正在处理堆转储中的实例转储。我的目标是找到具有重复数据的实例,这意味着遍历对象及其引用。我需要加快速度,所以我创建了一个缓存用于我已经完成的比较,但是缓存的内存效率非常低,因为它使用嵌套的 HashMap。我将不胜感激有关如何更有效地存储比较结果的任何建议。我的主要想法是存储我比较过的对象的 id 并存储比较的结果,要么它们是重复的,那么我缓存 true,或者它们不是,那么我缓存 false。
这是当前缓存的代码:
public class DefaultInstanceComparisonCache implements InstanceComparisonCache {
private final Map<Long,Map<Long,Boolean>> cache = new HashMap<>();
private long cacheHit = 0;
private long cacheMiss = 0;
@Override
public Optional<Boolean> instancesEqual(InstanceDump a,InstanceDump b) {
InstanceDump first = a.getInstanceId() < b.getInstanceId() ? a : b;
InstanceDump second = first == a ? b : a;
Optional<Boolean> result = Optional.ofNullable(cache.get(first.getInstanceId()))
.map(cachedComparison -> cachedComparison.get(second.getInstanceId()));
if (result.isPresent()) {
cacheHit++;
} else {
cacheMiss++;
}
return result;
}
@Override
public void cacheComparisonResult(InstanceDump a,InstanceDump b,boolean comparisonResult) {
InstanceDump first = a.getInstanceId() < b.getInstanceId() ? a : b;
InstanceDump second = first == a ? b : a;
cacheResult(first.getInstanceId(),second.getInstanceId(),comparisonResult);
}
@Override
public long getCacheHitCount() {
return cacheHit;
}
@Override
public long getCacheMissCount() {
return cacheMiss;
}
private void cacheResult(long instanceKey,long comparedTo,boolean comparisonResult) {
Map<Long,Boolean> cachedComparison = cache.computeIfAbsent(instanceKey,a -> new HashMap<>());
cachedComparison.put(comparedTo,comparisonResult);
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)