Skip to content

Commit 7123492

Browse files
committed
Build map more efficiently
Prefer building the list calling at the end maps:from_list/1 over building the map element by element. The 1st approach is chosen in the standard library functions, e.g. maps:map/2, maps:filter/2, maps:with/2
1 parent b0260cf commit 7123492

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

deps/rabbit/src/rabbit_amqp_session.erl

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,7 +1206,7 @@ handle_control(#'v1_0.disposition'{role = ?AMQP_ROLE_RECEIVER,
12061206
last = Last0,
12071207
state = Outcome,
12081208
settled = DispositionSettled} = Disposition,
1209-
#state{outgoing_unsettled_map = UnsettledMap,
1209+
#state{outgoing_unsettled_map = UnsettledMap0,
12101210
queue_states = QStates0} = State0) ->
12111211
Last = case Last0 of
12121212
?UINT(L) ->
@@ -1215,19 +1215,20 @@ handle_control(#'v1_0.disposition'{role = ?AMQP_ROLE_RECEIVER,
12151215
%% "If not set, this is taken to be the same as first." [2.7.6]
12161216
First
12171217
end,
1218-
UnsettledMapSize = map_size(UnsettledMap),
1218+
UnsettledMapSize = map_size(UnsettledMap0),
12191219
case UnsettledMapSize of
12201220
0 ->
12211221
{noreply, State0};
12221222
_ ->
12231223
DispositionRangeSize = diff(Last, First) + 1,
1224-
{Settled, UnsettledMap1} =
1224+
{Settled, UnsettledMap} =
12251225
case DispositionRangeSize =< UnsettledMapSize of
12261226
true ->
12271227
%% It is cheaper to iterate over the range of settled delivery IDs.
1228-
serial_number:foldl(fun settle_delivery_id/2, {#{}, UnsettledMap}, First, Last);
1228+
serial_number:foldl(fun settle_delivery_id/2, {#{}, UnsettledMap0}, First, Last);
12291229
false ->
12301230
%% It is cheaper to iterate over the outgoing unsettled map.
1231+
{Settled0, UnsettledList} =
12311232
maps:fold(
12321233
fun (DeliveryId,
12331234
#outgoing_unsettled{queue_name = QName,
@@ -1243,10 +1244,11 @@ handle_control(#'v1_0.disposition'{role = ?AMQP_ROLE_RECEIVER,
12431244
SettledAcc),
12441245
{SettledAcc1, UnsettledAcc};
12451246
false ->
1246-
{SettledAcc, UnsettledAcc#{DeliveryId => Unsettled}}
1247+
{SettledAcc, [{DeliveryId, Unsettled} | UnsettledAcc]}
12471248
end
12481249
end,
1249-
{#{}, #{}}, UnsettledMap)
1250+
{#{}, []}, UnsettledMap0),
1251+
{Settled0, maps:from_list(UnsettledList)}
12501252
end,
12511253

12521254
SettleOp = settle_op_from_outcome(Outcome),
@@ -1263,7 +1265,7 @@ handle_control(#'v1_0.disposition'{role = ?AMQP_ROLE_RECEIVER,
12631265
end
12641266
end, {QStates0, []}, Settled),
12651267

1266-
State1 = State0#state{outgoing_unsettled_map = UnsettledMap1,
1268+
State1 = State0#state{outgoing_unsettled_map = UnsettledMap,
12671269
queue_states = QStates},
12681270
Reply = case DispositionSettled of
12691271
true -> [];

0 commit comments

Comments
 (0)