From e3783485de5d88d791ab6669354d3f94ebe110ec Mon Sep 17 00:00:00 2001 From: martinsumner Date: Tue, 29 Nov 2016 11:13:08 +0000 Subject: [PATCH] Minor SkipList speed-up --- src/leveled_skiplist.erl | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/leveled_skiplist.erl b/src/leveled_skiplist.erl index eb490ee..5a68c0a 100644 --- a/src/leveled_skiplist.erl +++ b/src/leveled_skiplist.erl @@ -28,7 +28,7 @@ -include_lib("eunit/include/eunit.hrl"). --define(SKIP_WIDTH, 32). +-define(SKIP_WIDTH, 64). -define(INFINITY_KEY, {null, null, null, null, null}). -define(EMPTY_SKIPLIST, [{?INFINITY_KEY, []}]). @@ -56,15 +56,28 @@ enter(Key, Value, SkipList) -> SkipList), case Hash rem ?SKIP_WIDTH of 0 -> - {LHS, RHS} = lists:splitwith(fun({K, _V}) -> K < Key end, SubList), + {LHS, RHS} = lists:splitwith(fun({K, _V}) -> K =< Key end, SubList), SkpL1 = lists:keyreplace(MarkerKey, 1, SkipList, {MarkerKey, RHS}), SkpL2 = [{Key, lists:ukeysort(1, [{Key, Value}|LHS])}|SkpL1], lists:ukeysort(1, SkpL2); _ -> - UpdSubList = lists:ukeysort(1, [{Key, Value}|SubList]), + {LHS, RHS} = lists:splitwith(fun({K, _V}) -> K < Key end, SubList), + UpdSubList = + case RHS of + [] -> + LHS ++ [{Key, Value}]; + [{FirstKey, _V}|RHSTail] -> + case FirstKey of + Key -> + LHS ++ [{Key, Value}] ++ RHSTail; + _ -> + LHS ++ [{Key, Value}] ++ RHS + end + end, lists:keyreplace(MarkerKey, 1, SkipList, {MarkerKey, UpdSubList}) end. + from_list(UnsortedKVL) -> KVL = lists:ukeysort(1, UnsortedKVL), Slots = length(KVL) div ?SKIP_WIDTH,