summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@rabbitmq.com>2011-10-01 09:55:20 +0100
committerMatthias Radestock <matthias@rabbitmq.com>2011-10-01 09:55:20 +0100
commit556e8080c56662ffcc999eea096cef7a33030ad2 (patch)
treeaec666a66d770358e583ceb457e4369091ca0feb
parent4ad8acb5e3123e869cfb9c17cb5716d31cc26836 (diff)
downloadrabbitmq-server-git-556e8080c56662ffcc999eea096cef7a33030ad2.tar.gz
speed up acks a bit
gb_trees are generally faster than dicts. Worth 1-2% in "MCM" when running with two Erlang schedulers.
-rw-r--r--src/rabbit_channel.erl15
1 files changed, 5 insertions, 10 deletions
diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl
index e408f0bfd9..3d264330d3 100644
--- a/src/rabbit_channel.erl
+++ b/src/rabbit_channel.erl
@@ -1317,16 +1317,11 @@ notify_queues(State = #ch{consumer_mapping = Consumers}) ->
State#ch{state = closing}}.
fold_per_queue(F, Acc0, UAQ) ->
- D = rabbit_misc:queue_fold(
- fun ({_DTag, _CTag, {QPid, MsgId}}, D) ->
- %% dict:append would avoid the lists:reverse in
- %% handle_message({recover, true}, ...). However, it
- %% is significantly slower when going beyond a few
- %% thousand elements.
- rabbit_misc:dict_cons(QPid, MsgId, D)
- end, dict:new(), UAQ),
- dict:fold(fun (QPid, MsgIds, Acc) -> F(QPid, MsgIds, Acc) end,
- Acc0, D).
+ T = rabbit_misc:queue_fold(
+ fun ({_DTag, _CTag, {QPid, MsgId}}, T) ->
+ rabbit_misc:gb_trees_cons(QPid, MsgId, T)
+ end, gb_trees:empty(), UAQ),
+ rabbit_misc:gb_trees_fold(F, Acc0, T).
enable_limiter(State = #ch{unacked_message_q = UAMQ,
limiter = Limiter}) ->