Re: [PATCH] grep: do not do external grep on skip-worktree entries
- From
Linus Torvalds <torvalds@linux-foundation.org>
- Date
- Jan 4, 2010, 16:01 UTC
- Message-ID
- <alpine.LFD.2.00.1001040755130.3630@localhost.localdomain>
- In-Reply-To
- <20100104080940.GA4815@coredump.intra.peff.net>
On Mon, 4 Jan 2010, Jeff King wrote:
Show 5 quoted lines
> > However, gprof reports that for the pcre dfa case, we spend more time in > grep.c:end_of_line than we do actually running the regex. So clearly > there are some other micro-optimizations in GNU grep that are making a > difference, too.
Don't use gprof. You're _much_ better off using the newish Linux 'perf' tool. It's quite competent, and doesn't need the code to be compiled with -pg (which totally changes all performance characteristics).
Do something like this:
perf record git grep qwerty
followed by
perf report perf annotate grep_buffer_1
(that "perf report" gives a per-symbol overview, the "perf annotate" gives a disassembly with source annotations and per-instruction costs). It works with inlining too, so you get things like this:
...
: static char *end_of_line(char *cp, unsigned long *left)
: {
: unsigned long l = *left;
: while (l && *cp != '\n') {
24.76 : 476a50: 80 3b 0a cmpb $0xa,(%rbx)
10.46 : 476a53: 0f 84 e7 00 00 00 je 476b40 <grep_buffer_1+0x1b0>
: l--;
: cp++;
21.19 : 476a59: 48 83 c3 01 add $0x1,%rbx
: }
:
: static char *end_of_line(char *cp, unsigned long *left)
: {
: unsigned long l = *left;
: while (l && *cp != '\n') {
0.94 : 476a5d: 49 83 ed 01 sub $0x1,%r13
4.85 : 476a61: 75 ed jne 476a50 <grep_buffer_1+0xc0>
:
...and yes, it's all the per-line crap.
The perf tools are included with modern kernels in tools/perf (which also has a Documentation subdirectory). I can pretty much guarantee that once you start using it, you'll never use gprof or oprofile again.
Linus