微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

比较结果的高效缓存

如何解决比较结果的高效缓存

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