summaryrefslogtreecommitdiff
path: root/builtin
diff options
context:
space:
mode:
authorThomas Rast <trast@student.ethz.ch>2011-12-12 21:16:08 (GMT)
committerJunio C Hamano <gitster@pobox.com>2011-12-16 23:47:25 (GMT)
commit53b8d931b649a0d82e16358a6bf1dd980dc24a6b (patch)
tree72599a8be5639a34231de0de586a670be62ffc3e /builtin
parent0579f91dd74a0902e52d1e6e839cc31b99f12cfc (diff)
downloadgit-53b8d931b649a0d82e16358a6bf1dd980dc24a6b.zip
git-53b8d931b649a0d82e16358a6bf1dd980dc24a6b.tar.gz
git-53b8d931b649a0d82e16358a6bf1dd980dc24a6b.tar.bz2
grep: disable threading in non-worktree case
Measurements by various people have shown that grepping in parallel is not beneficial when the object store is involved. For example, with a simple regex: Threads | --cached case | worktree case ---------------------------------------------------------------- 8 (default) | 2.88u 0.21s 0:02.94real | 0.19u 0.32s 0:00.16real 4 | 2.89u 0.29s 0:02.99real | 0.16u 0.34s 0:00.17real 2 | 2.83u 0.36s 0:02.87real | 0.18u 0.32s 0:00.26real NO_PTHREADS | 2.16u 0.08s 0:02.25real | 0.12u 0.17s 0:00.31real This happens because all the threads contend on read_sha1_mutex almost all of the time. A more complex regex allows the threads to do more work in parallel, but as Jeff King found out, the "super boost" (much higher clock when only one core is active) feature of recent CPUs still causes the unthreaded case to win by a large margin. So until the pack machinery allows unthreaded access, we disable grep's threading in all but the worktree case. Helped-by: René Scharfe <rene.scharfe@lsrfire.ath.cx> Helped-by: Jeff King <peff@peff.net> Signed-off-by: Thomas Rast <trast@student.ethz.ch> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin')
-rw-r--r--builtin/grep.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/builtin/grep.c b/builtin/grep.c
index 6474eed..9ce064a 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -1002,24 +1002,6 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
if (!opt.fixed && opt.ignore_case)
opt.regflags |= REG_ICASE;
-#ifndef NO_PTHREADS
- if (online_cpus() == 1)
- use_threads = 0;
-#else
- use_threads = 0;
-#endif
-
- opt.use_threads = use_threads;
-
-#ifndef NO_PTHREADS
- if (use_threads) {
- if (opt.pre_context || opt.post_context || opt.file_break ||
- opt.funcbody)
- skip_first_line = 1;
- start_threads(&opt);
- }
-#endif
-
compile_grep_patterns(&opt);
/* Check revs and then paths */
@@ -1041,6 +1023,24 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
break;
}
+#ifndef NO_PTHREADS
+ if (list.nr || cached || online_cpus() == 1)
+ use_threads = 0;
+#else
+ use_threads = 0;
+#endif
+
+ opt.use_threads = use_threads;
+
+#ifndef NO_PTHREADS
+ if (use_threads) {
+ if (opt.pre_context || opt.post_context || opt.file_break ||
+ opt.funcbody)
+ skip_first_line = 1;
+ start_threads(&opt);
+ }
+#endif
+
/* The rest are paths */
if (!seen_dashdash) {
int j;