在短时间内从地图中删除的最佳方法

Best way to remove from map in short amount of time

提问人:edith finch 提问时间:11/17/2023 最后编辑:Mark Rotteveeledith finch 更新时间:11/17/2023 访问量:42

问:

我有这个记录

private static record BlockedPattern (Class<? extends Pattern> getClazz, Predicate<MyObject> getPredicate, long getActiveUntil) {}

我像这样存储在 ConcurrentHashMap 中

private final Map<Class<? extends Pattern>, BlockedPattern> _patterns = new ConcurrentHashMap<>();

我的代码每 400 毫秒检查一次,使用检查时间是否经过或谓词是否为 false 的方法对每个对象执行一次检查。考虑到我可以有 400-800 个对象,这意味着每 400 毫秒进行 800 次检查,甚至更多 (Java 21)。删除方法中传递的模式或错误谓词的最佳方法是什么?isBlockedisBlocked

使用 removeIf,使用迭代器还是什么?我想要最快的选择和轻便的方式。

注意:map 最多可以保留 3 个元素。没有更多,因为我只有 2-3 个模式。

removeIf 并检查 System.currentMillisecond() 是否> getActiveUntil 或 !getPredicate.test()

爪哇岛

评论

0赞 daniu 11/17/2023
创建映射的非并发副本,在那里执行操作,然后替换旧映射?
2赞 knittl 11/17/2023
这是瓶颈吗?0.5 毫秒的简单检查似乎足够了。
0赞 k314159 11/17/2023
如果地图仅包含 3 个元素,则使用 3 元素数组可能会获得更好的性能。这样,您就不会有哈希的开销。
0赞 edith finch 11/18/2023
0.5 ms 为环路延迟。每 0.5 毫秒,它会通过 900 个对象并执行 isBlocked 检查。

答:

0赞 Mbali Hlubi 11/17/2023 #1

对于基于时间条件和谓词的高性能和轻量级对象删除,可以使用“removeIf”和自定义删除条件的组合。在这种情况下,可能不需要使用迭代器。