2021年2月6日土曜日

BSD grep の今

 container_of をゴソゴソと見てるとき、macOS 上にソース持ってきて当初は grep してたのだけど、あれ、これやたら遅いな?と思いやっぱり ripgrep だなと rg にしたのだった。

macOS の grep (BSD grep) はGNU grep より遅いね、というのはささっとググるだけでこんな感じで見つかる。BSD grep が遅いのか、GNU grep が速いのか。

https://lists.freebsd.org/pipermail/freebsd-current/2010-August/019310.html

http://jlebar.com/2012/11/28/GNU_grep_is_10x_faster_than_Mac_grep.html

 

うん、おそい。

$ time grep -r ^#include . |wc -l; grep --version
  341659

real    0m14.074s
user    0m12.134s
sys    0m1.902s
grep (BSD grep) 2.5.1-FreeBSD

$ time ggrep -r ^#include . |wc -l; ggrep --version
  335204

real    0m2.162s
user    0m0.762s
sys    0m1.411s
ggrep (GNU grep) 3.6
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others; see
<https://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

$ time rg ^#include |wc -l; rg --version
  335204

real    0m0.557s
user    0m1.036s
sys    0m2.906s
ripgrep 12.1.1 (rev 9c8d873a75)
-SIMD -AVX (compiled)
+SIMD +AVX (runtime)

ん、BSD grep とそれ以外で数が合わない。いやいや・・diff とってみてもこの差が出るのかわからんぞ・・


以下は VM な FreeBSD 12.2-R で。BSD grep 最も遅いけどもだいぶマシになっている感。

$ time grep -r ^#include . |wc -l; grep --version
  341714

real    0m2.061s
user    0m0.999s
sys     0m1.149s
grep (GNU grep) 2.5.1-FreeBSD

Copyright 1988, 1992-1999, 2000, 2001 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ time bsdgrep -r ^#include . |wc -l; bsdgrep --version
  341714

real    0m3.863s
user    0m2.525s
sys     0m1.435s
bsdgrep (BSD grep) 2.6.0-FreeBSD

$ time rg ^#include |wc -l; rg --version
  335259

real    0m0.872s
user    0m1.242s
sys     0m2.031s
ripgrep 12.1.1
+SIMD -AVX (compiled)
+SIMD +AVX (runtime)

これもまた数が合わない、今度は ripgrep が。

find ~ xargs しましょう

 $ time find . -type f|xargs rg ^#include |wc -l
  335259

real    0m1.257s
user    0m1.356s
sys     0m2.155s
$ time find . -type f|xargs grep ^#include |wc -l
  335259

real    0m1.906s
user    0m0.824s
sys     0m1.235s
$ time find . -type f|xargs bsdgrep ^#include |wc -l
  335259

real    0m3.522s
user    0m2.560s
sys     0m1.110s

0 件のコメント:

コメントを投稿