This is an automated email from the ASF dual-hosted git repository.

vatamane pushed a commit to branch optimize-key-tree-using-maps
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit 2908b8de4c9c17257cebae4a21b2eed2c1b2565e
Author: Nick Vatamaniuc <[email protected]>
AuthorDate: Mon Mar 21 13:32:31 2022 -0400

    Opimtize key tree stemming by using maps instead of sets
    
    sets to due to a compiler bug in 22 consumes too much memory and is slower 
on Erlang 22+
    
    Reproducer: https://gist.github.com/nickva/ddc499e6e05678faf20d344c6e11daaa
    
    With sets:
    ```
    couch_key_tree:gen_and_stem().
    {8,6848.812683105469}
    ```
    
    With maps:
    ```
    couch_key_tree:gen_and_stem().
    {0,544.000732421875}
    ```
---
 src/couch/src/couch_key_tree.erl | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/couch/src/couch_key_tree.erl b/src/couch/src/couch_key_tree.erl
index 84c7861..6c8637b 100644
--- a/src/couch/src/couch_key_tree.erl
+++ b/src/couch/src/couch_key_tree.erl
@@ -496,7 +496,7 @@ stem(Trees, Limit) ->
                 {NewSeen, NewBranches} = stem_tree(Tree, Limit, Seen),
                 {NewSeen, NewBranches ++ TreeAcc}
             end,
-            {sets:new(), []},
+            {#{}, []},
             Trees
         ),
         lists:sort(Branches)
@@ -553,11 +553,11 @@ stem_tree(Depth, {Key, Val, Children}, Limit, Seen0) ->
     end.
 
 check_key(Key, Seen) ->
-    case sets:is_element(Key, Seen) of
-        true ->
+    case Seen of
+        #{Key := true} ->
             throw(dupe_keys);
-        false ->
-            sets:add_element(Key, Seen)
+        _ ->
+            Seen#{Key => true}
     end.
 
 repair_tree(Trees, Limit) ->

Reply via email to