From: Derrick Stolee Date: Tue, 03 Apr 2018 12:15:09 GMT Subject: Re: [PATCH 0/3] Lazy-load trees when reading commit-graph Message-ID: <00d5cd22-3492-73cf-3493-1f6f1ec15922@gmail.com> In-Reply-To: <20180403120057.173849-1-dstolee@microsoft.com> On 4/3/2018 8:00 AM, Derrick Stolee wrote: > There are several commit-graph walks that require loading many commits > but never walk the trees reachable from those commits. However, the > current logic in parse_commit() requires the root tree to be loaded. > This only uses lookup_tree(), but when reading commits from the commit- > graph file, the hashcpy() to load the root tree hash and the time spent > checking the object cache take more time than parsing the rest of the > commit. > > In this patch series, all direct references to accessing the 'tree' > member of struct commit are replaced instead by one of the following > methods: > > struct tree *get_commit_tree(struct commit *) > struct object_id *get_commit_tree_oid(struct commit *) > > This replacement was assisted by a Coccinelle script, but the 'tree' > member is overloaded in other types, so the script gave false-positives > that were removed from the diff. > > After all access is restricted to use these methods, we can then > change the postcondition of parse_commit_in_graph() to allow 'tree' > to be NULL. If the tree is accessed later, we can load the tree's > OID from the commit-graph in constant time and perform the lookup_tree(). > > On the Linux repository, performance tests were run for the following > command: > > git log --graph --oneline -1000 > > Before: 0.83s > After: 0.65s > Rel %: -21.6% > > Adding '-- kernel/' to the command requires loading the root tree > for every commit that is walked. There was no measureable performance > change as a result of this patch. > > This patch series depends on v7 of ds/commit-graph. > > Derrick Stolee (3): > commit: create get_commit_tree() method > treewide: use get_commit_tree() for tree access > commit-graph: lazy-load trees > This patch series is also available as a GitHub pull request [1] [1] https://github.com/derrickstolee/git/pull/4