如何解决比较结果的高效缓存
我正在处理堆转储中的实例转储。我的目标是找到具有重复数据的实例,这意味着遍历对象及其引用。我需要加快速度,所以我创建了一个缓存用于我已经完成的比较,但是缓存的内存效率非常低,因为它使用嵌套的 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 举报,一经查实,本站将立刻删除。