[
https://issues.apache.org/jira/browse/AMQ-5825?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14581393#comment-14581393
]
Tim Bain commented on AMQ-5825:
-------------------------------
TreeSet will only work if you do what I suggest about keeping the index of the
current "first" element, because we manually reorder the List (which is why it
needs to be a List as currently implemented). So yes, if you do that, TreeSet
would simplify the sorted insertion, but otherwise you have to stick with List.
> Improve performance of Queue.addToConsumerList()
> ------------------------------------------------
>
> Key: AMQ-5825
> URL: https://issues.apache.org/jira/browse/AMQ-5825
> Project: ActiveMQ
> Issue Type: Bug
> Components: Broker
> Affects Versions: 5.11.1
> Reporter: Tim Bain
> Priority: Minor
> Labels: performance
>
> In a Users mailing list post
> (http://activemq.2283324.n4.nabble.com/More-ActiveMQ-hotspots-courtesy-of-continuous-profiling-td4697159.html),
> Kevin Burton noticed that Queue.addToConsumerList() was taking 5% of his CPU
> cycles because we're re-sorting after every insert, which is expensive when
> we have lots of consumers. His scenario's a little unique because he uses far
> more destinations (and far more consumers) than most installations, but it
> still highlighted a potential performance improvement.
> I think we can do a sorted insertion (iterate through the list till you find
> the right place based on the comparator, then insert) to skip the re-sort.
> Either we'll be rolling the list or we won't, but either way the list will be
> in sorted order, except that the minimum element might not be the first one.
> So we'd find the minimum element's index (which is O(log N), but can be
> optimized to O(1) for the not-rolling case), then do a sorted insert starting
> at that index and wrapping if necessary.
> Even better, we could implement rolling by just keeping the index of the
> current "first" element, which we would increment each time the list rolled.
> Then instead of looking at element 0, we'd just get that element, which would
> spare us the O(N) operation to roll the list each time we did that. And at
> that point, finding the minimum element's index becomes O(1), not O(log N),
> which is a nice benefit.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)