You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2014/02/05 00:06:22 UTC
[09/50] couch commit: updated refs/heads/import to c3116d7
Optimize merge_updates
There are two basic strategies here. We move the function clauses which
are matched less often to the end of the function definition, and we use
a body-recursive implementation instead of tail-recursion with a final
reverse. The latter change is motivated by the implementation of
orddict:merge/3 in the stdlib, and simple benchmarks on R14B04 indicate
that the body recursive implementation is faster for all batch sizes.
Project: http://git-wip-us.apache.org/repos/asf/couchdb-couch/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-couch/commit/ab085a1a
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-couch/tree/ab085a1a
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-couch/diff/ab085a1a
Branch: refs/heads/import
Commit: ab085a1aa6d6ac1df06a191efdb19d75fae8ea97
Parents: 0514f49
Author: Adam Kocoloski <ad...@cloudant.com>
Authored: Fri Feb 24 16:11:13 2012 -0500
Committer: Paul J. Davis <pa...@gmail.com>
Committed: Tue Feb 4 17:03:23 2014 -0600
----------------------------------------------------------------------
src/couch_db_updater.erl | 26 +++++++++++---------------
1 file changed, 11 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/ab085a1a/src/couch_db_updater.erl
----------------------------------------------------------------------
diff --git a/src/couch_db_updater.erl b/src/couch_db_updater.erl
index 414e3a0..1be3e3a 100644
--- a/src/couch_db_updater.erl
+++ b/src/couch_db_updater.erl
@@ -308,20 +308,16 @@ handle_info({'DOWN', Ref, _, _, Reason}, #db{fd_monitor=Ref, name=Name} = Db) ->
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
-
-merge_updates([], RestB, AccOutGroups) ->
- lists:reverse(AccOutGroups, RestB);
-merge_updates(RestA, [], AccOutGroups) ->
- lists:reverse(AccOutGroups, RestA);
-merge_updates([[{_, {#doc{id=IdA}, _}}|_]=GroupA | RestA],
- [[{_, {#doc{id=IdB}, _}}|_]=GroupB | RestB], AccOutGroups) ->
- if IdA == IdB ->
- merge_updates(RestA, RestB, [GroupA ++ GroupB | AccOutGroups]);
- IdA < IdB ->
- merge_updates(RestA, [GroupB | RestB], [GroupA | AccOutGroups]);
- true ->
- merge_updates([GroupA | RestA], RestB, [GroupB | AccOutGroups])
- end.
+merge_updates([[{_,#doc{id=X}}|_]=A|RestA], [[{_,#doc{id=X}}|_]=B|RestB]) ->
+ [A++B | merge_updates(RestA, RestB)];
+merge_updates([[{_,#doc{id=X}}|_]|_]=A, [[{_,#doc{id=Y}}|_]|_]=B) when X < Y ->
+ [hd(A) | merge_updates(tl(A), B)];
+merge_updates([[{_,#doc{id=X}}|_]|_]=A, [[{_,#doc{id=Y}}|_]|_]=B) when X > Y ->
+ [hd(B) | merge_updates(A, tl(B))];
+merge_updates([], RestB) ->
+ RestB;
+merge_updates(RestA, []) ->
+ RestA.
collect_updates(GroupedDocsAcc, ClientsAcc, MergeConflicts, FullCommit) ->
receive
@@ -333,7 +329,7 @@ collect_updates(GroupedDocsAcc, ClientsAcc, MergeConflicts, FullCommit) ->
GroupedDocs2 = [[{Client, Doc} || Doc <- DocGroup]
|| DocGroup <- GroupedDocs],
GroupedDocsAcc2 =
- merge_updates(GroupedDocsAcc, GroupedDocs2, []),
+ merge_updates(GroupedDocsAcc, GroupedDocs2),
collect_updates(GroupedDocsAcc2, [Client | ClientsAcc],
MergeConflicts, (FullCommit or FullCommit2))
after 0 ->