Official request: Please make GNU grep the default

Dag-Erling Smørgrav des at des.no
Thu Aug 19 13:38:56 UTC 2010


Gabor Kovesdan <gabor at FreeBSD.org> writes:
> I've just committed a patch with the kind help of Dimitry Andric,
> which gives BSD grep a huge performance boost. The performance is now
> almost comparable to GNU grep.

Not quite, as Doug pointed out.  I don't know what benchmark you're
using, but I'm using a greatly simplified variant of Doug's:

% time sh -c 'for n in $(jot 1000) ; do /usr/obj/usr/src/usr.bin/grep/grep -q "^xfce4-wm" /usr/ports/INDEX-9 ; done' 
sh -c   13.57s user 7.06s system 99% cpu 20.783 total
% time sh -c 'for n in $(jot 1000) ; do /usr/obj/usr/src/gnu/usr.bin/grep/grep -q "^xfce4-wm" /usr/ports/INDEX-9 ; done'
sh -c   7.98s user 7.47s system 100% cpu 15.424 total

The bottleneck is now in quite an unexpected location:

  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 38.8       0.03     0.03    12717     0.00     0.00  memchr [5]
 35.6       0.07     0.03      395     0.08     0.08  _read [6]
 16.4       0.08     0.01        0  100.00%           _mcount [7]
  1.7       0.08     0.00    12362     0.00     0.00  memset [9]
  1.5       0.08     0.00        0  100.00%           .mcount (110)
  1.5       0.08     0.00        0   43.41%           re_search_internal [8]
  0.8       0.08     0.00      820     0.00     0.00  memcpy [12]
  0.6       0.09     0.00    37045     0.00     0.00  free [13]
  0.6       0.09     0.00    12332     0.00     0.01  grep_fgetln [4]
  0.6       0.09     0.00        1     0.49    66.27  procfile [3]
  0.4       0.09     0.00        0  100.00%           re_string_construct_common [26]
  0.3       0.09     0.00        1     0.25     0.34  _Read_RuneMagi [27]
  0.1       0.09     0.00      261     0.00     0.00  arena_avail_comp [39]
  0.1       0.09     0.00      155     0.00     0.00  arena_malloc [24]
  0.1       0.09     0.00      153     0.00     0.00  arena_bin_malloc_easy [40]
  0.1       0.09     0.00       54     0.00     0.00  arena_avail_tree_insert [35]
  0.1       0.09     0.00        5     0.02     0.02  arena_purge [37]
  0.1       0.09     0.00        3     0.04     0.44  setlocale [10]
  0.1       0.09     0.00        1     0.12     0.46  __wrap_setrunelocale [21]
  0.1       0.09     0.00        0   21.76%           re_string_destruct [14]
  0.1       0.09     0.00        0  100.00%           regexec [38]

The culprit seems to be the first memchr() in grep_fgetln().  For some
reason, even with -O2, it is not inlined:

% echo "disassemble grep_fgetln" | gdb -q -batch -x /dev/stdin /usr/obj/usr/src/usr.bin/grep/grep | grep memchr
0x000000000040291e <grep_fgetln+244>:	callq  0x40176c <memchr>
0x00000000004029fa <grep_fgetln+464>:	callq  0x40176c <memchr>

DES
-- 
Dag-Erling Smørgrav - des at des.no


More information about the freebsd-current mailing list