treeset 上的性能问题#add
performance issue on treeset#add
在我的应用程序中,我使用 TreeSet
作为有序队列。我分析了我的应用程序,我将 25% 的 cpu 时间花在向 TreeSet
添加元素上,但只花 2% 的时间弹出最后一个元素。有序队列有更好的集合吗?添加到 LinkedList
并在每次我需要使用队列时对其进行排序会更高效吗?
您应该使用 PriorityQueue
而不是 TreeSet
,因为这是为队列设计的。
TreeSet
在将其用作队列时存在性能问题,因为其内部树结构不适合用作队列。这是因为它的内部结构是基于一个TreeMap
,withs使用了一个red black tree,并且这棵树需要移动很多元素来容纳替换顶部元素的插入。在某些情况下,这需要完全重建树。
使用 PriorityQueue
很简单:
PriorityQueue<YourObject> queue = new PriorityQueue<>();
与 TreeSet
不同,PriorityQueue
允许重复元素,并以 FIFO 顺序返回。
如果您需要防踩踏解决方案,您应该使用 PriorityBlockingQueue
。
在我的应用程序中,我使用 TreeSet
作为有序队列。我分析了我的应用程序,我将 25% 的 cpu 时间花在向 TreeSet
添加元素上,但只花 2% 的时间弹出最后一个元素。有序队列有更好的集合吗?添加到 LinkedList
并在每次我需要使用队列时对其进行排序会更高效吗?
您应该使用 PriorityQueue
而不是 TreeSet
,因为这是为队列设计的。
TreeSet
在将其用作队列时存在性能问题,因为其内部树结构不适合用作队列。这是因为它的内部结构是基于一个TreeMap
,withs使用了一个red black tree,并且这棵树需要移动很多元素来容纳替换顶部元素的插入。在某些情况下,这需要完全重建树。
使用 PriorityQueue
很简单:
PriorityQueue<YourObject> queue = new PriorityQueue<>();
与 TreeSet
不同,PriorityQueue
允许重复元素,并以 FIFO 顺序返回。
如果您需要防踩踏解决方案,您应该使用 PriorityBlockingQueue
。