This series focuses on allowing parallel access to zlib inflation and
using that to perform a faster git-grep in the non-worktree case.
Threads were disabled for this case at 53b8d93 ("grep: disable
threading in non-worktree case", 12-12-2011), due to performance drops.
However, by allowing threads to perform inflation in parallel, we can
regain the speedup. This is a good hotspot for parallelism as some test
cases[1] showed that it can account for up to 48% of execution time.
And besides that, inflation tasks are already independent of each other.
As a result, grepping 'abcd[02]' ("Regex 1") and
'(static|extern) (int|double) \*' ("Regex 2") at chromium's
repository[2], I got (means of 30 executions):
Threads | Regex 1 | Regex 2
---------|------------|-----------
1 | 17.3557s | 20.8410s
2 | 9.7170s | 11.2415s
8 | 6.1723s | 6.9378s
As a reference, just enabling threads in the non-worktree case,
without parallel inflation, I got:
Threads | Regex 1 | Regex 2
---------|------------|-----------
1 | 17.1359s | 20.8306s
2 | 14.5036s | 15.4172s
8 | 13.6304s | 13.8659s
For now, the optimization is not supported when --textconv or
--recurse-submodules are used, but I hope to send another patchset for
that still during GSoC. We may also try to allow even more parallelism,
refining the added 'obj_read_lock'.
[1]:
https://matheustavares.gitlab.io/posts/week-6-working-at-zlib-inflation#multithreading-zlib-inflation
[2]: chromium’s repo at commit 03ae96f (“Add filters testing at DSF=2”,
04-06-2019), after a 'git gc' execution.
travis build: https://travis-ci.org/matheustavares/git/builds/570255029
Matheus Tavares (4):
object-store: add lock to read_object_file_extended()
grep: allow locks to be enabled individually
grep: disable grep_read_mutex when possible
grep: re-enable threads in some non-worktree cases
Documentation/git-grep.txt | 12 ++++++++
builtin/grep.c | 22 +++++++++++---
grep.c | 4 +--
grep.h | 8 +++--
object-store.h | 4 +++
packfile.c | 7 +++++
sha1-file.c | 61 ++++++++++++++++++++++++++++++++++----
7 files changed, 105 insertions(+), 13 deletions(-)
--
2.22.0