Improve from_list speed
This commit is contained in:
parent
220d493b5a
commit
1745ba6863
1 changed files with 10 additions and 10 deletions
|
@ -35,7 +35,7 @@
|
||||||
|
|
||||||
from_orderedlist(OrderedList) ->
|
from_orderedlist(OrderedList) ->
|
||||||
L = length(OrderedList),
|
L = length(OrderedList),
|
||||||
{tree, L, from_orderedlist(OrderedList, empty_tree(), L)}.
|
{tree, L, from_orderedlist(OrderedList, [], L)}.
|
||||||
|
|
||||||
from_orderedset(Table) ->
|
from_orderedset(Table) ->
|
||||||
from_orderedlist(ets:tab2list(Table)).
|
from_orderedlist(ets:tab2list(Table)).
|
||||||
|
@ -98,13 +98,13 @@ empty() ->
|
||||||
%%%============================================================================
|
%%%============================================================================
|
||||||
|
|
||||||
|
|
||||||
from_orderedlist([], Tree, _L) ->
|
from_orderedlist([], TmpList, _L) ->
|
||||||
Tree;
|
gb_trees:from_orddict(TmpList);
|
||||||
from_orderedlist(OrdList, Tree, L) ->
|
from_orderedlist(OrdList, TmpList, L) ->
|
||||||
SubLL = min(?SKIP_WIDTH, L),
|
SubLL = min(?SKIP_WIDTH, L),
|
||||||
{Head, Tail} = lists:split(SubLL, OrdList),
|
{Head, Tail} = lists:split(SubLL, OrdList),
|
||||||
{LastK, _LastV} = lists:last(Head),
|
{LastK, _LastV} = lists:last(Head),
|
||||||
from_orderedlist(Tail, tree_insert(LastK, Head, Tree), L - SubLL).
|
from_orderedlist(Tail, TmpList ++ [{LastK, Head}], L - SubLL).
|
||||||
|
|
||||||
lookup_match(_Key, []) ->
|
lookup_match(_Key, []) ->
|
||||||
none;
|
none;
|
||||||
|
@ -174,9 +174,6 @@ lookup_range_end(EndRange, {NK0, SL0}, Iter0, Output, EndRangeFun) ->
|
||||||
empty_tree() ->
|
empty_tree() ->
|
||||||
gb_trees:empty().
|
gb_trees:empty().
|
||||||
|
|
||||||
tree_insert(K, V, T) ->
|
|
||||||
gb_trees:insert(K, V, T).
|
|
||||||
|
|
||||||
tree_to_list(T) ->
|
tree_to_list(T) ->
|
||||||
gb_trees:to_list(T).
|
gb_trees:to_list(T).
|
||||||
|
|
||||||
|
@ -230,6 +227,7 @@ tree_search_test() ->
|
||||||
|
|
||||||
StartKeyFun = fun(V) -> V end,
|
StartKeyFun = fun(V) -> V end,
|
||||||
|
|
||||||
|
SW = os:timestamp(),
|
||||||
?assertMatch([], search_range(0, 1, T, StartKeyFun)),
|
?assertMatch([], search_range(0, 1, T, StartKeyFun)),
|
||||||
?assertMatch([], search_range(201, 202, T, StartKeyFun)),
|
?assertMatch([], search_range(201, 202, T, StartKeyFun)),
|
||||||
?assertMatch([{4, 2}], search_range(2, 4, T, StartKeyFun)),
|
?assertMatch([{4, 2}], search_range(2, 4, T, StartKeyFun)),
|
||||||
|
@ -239,11 +237,13 @@ tree_search_test() ->
|
||||||
?assertMatch(50, length(search_range(2, 198, T, StartKeyFun))),
|
?assertMatch(50, length(search_range(2, 198, T, StartKeyFun))),
|
||||||
?assertMatch(49, length(search_range(2, 197, T, StartKeyFun))),
|
?assertMatch(49, length(search_range(2, 197, T, StartKeyFun))),
|
||||||
?assertMatch(49, length(search_range(4, 197, T, StartKeyFun))),
|
?assertMatch(49, length(search_range(4, 197, T, StartKeyFun))),
|
||||||
?assertMatch(48, length(search_range(5, 197, T, StartKeyFun))).
|
?assertMatch(48, length(search_range(5, 197, T, StartKeyFun))),
|
||||||
|
io:format(user, "10 range tests in ~w microseconds~n",
|
||||||
|
[timer:now_diff(os:timestamp(), SW)]).
|
||||||
|
|
||||||
|
|
||||||
tree_test() ->
|
tree_test() ->
|
||||||
N = 4000,
|
N = 2000,
|
||||||
KL = lists:ukeysort(1, generate_randomkeys(1, N, 1, N div 5)),
|
KL = lists:ukeysort(1, generate_randomkeys(1, N, 1, N div 5)),
|
||||||
|
|
||||||
OS = ets:new(test, [ordered_set, private]),
|
OS = ets:new(test, [ordered_set, private]),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue