Official request: Please make GNU grep the default
Tijl Coosemans
tijl at coosemans.org
Thu Aug 19 15:34:29 UTC 2010
On Thursday 19 August 2010 15:38:54 Dag-Erling Smørgrav wrote:
> 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>
The base system gcc doesn't have a built-in version of memchr to inline.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 228 bytes
Desc: This is a digitally signed message part.
Url : http://lists.freebsd.org/pipermail/freebsd-current/attachments/20100819/7c0240b5/attachment.pgp
More information about the freebsd-current
mailing list