diff options
| author | Matthias Radestock <matthias@rabbitmq.com> | 2011-10-01 09:55:20 +0100 |
|---|---|---|
| committer | Matthias Radestock <matthias@rabbitmq.com> | 2011-10-01 09:55:20 +0100 |
| commit | 556e8080c56662ffcc999eea096cef7a33030ad2 (patch) | |
| tree | aec666a66d770358e583ceb457e4369091ca0feb | |
| parent | 4ad8acb5e3123e869cfb9c17cb5716d31cc26836 (diff) | |
| download | rabbitmq-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.erl | 15 |
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}) -> |
