我算法的一个关键部分是克隆Set
个对象。我尝试了几种优化此操作的方法,包括:
clone
方法,而不是手动插入对象 - 获得较小的性能提升(可能原因见下文)。然而,分析显示克隆操作仍然需要很长时间。我可以忍受它,但我一直想知道是否有任何技巧可以让我进一步优化这个操作 - 例如,我听说过通过序列化克隆的技巧,虽然我不确定会不会帮助
我也愿意切换到Java的Set
接口的不同实现,只要它依赖于hashCode
和equals
。我的集合通常不是很大,高达几十个项目,所以我也愿意牺牲传统集合运算符(add
,contains
)的一些效率,如果它可以帮助的话。我甚至考虑过转移到由LinkedList
或一些跳过列表支持的自定义实现,但在此之前我想问一下是否有人对此有任何经验或见解。
编辑:对于那些要求为什么我需要多次克隆这些集合的人 - 这是一个很好的问题!现在算法依赖于初始化一组集合与另一组集合相同,后来这两个组可以独立更新,这就是为什么克隆对我来说似乎是一个明显的解决方案 - 但是肯定存在一个更好的解决方案。正如我在上面的第4个子弹中写的那样,我可能确实选择了不同的解决方案,但同时我想将这个问题集中在优化现有的上。
答案 0 :(得分:0)
序列化比深度克隆慢得多。我怀疑它会有所帮助。
最高性能的解决方案是避免首先需要克隆,然后根本不需要任何时间。也许有关于您使用克隆的原因的详细信息,我们可以提出另一种选择。
加速克隆的一种方法是使用一个引用不可变集的Set,并记住Map<E, Boolean>
中的差异,其中值为true或false,具体取决于是否已添加或删除。如果变化的数量相对较少,这将最有效。