比较结果的高效缓存

问题描述

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