Você pode descobrir que:
LC_ALL=C grep -Ec '^[[:blank:]]*xx([[:blank:]]|$)'
é consideravelmente mais rápido, pois evita a sobrecarga de awk
ter que interpretar uma linguagem de nível superior.
Estamos usando LC_ALL=C
para simplificar a interpretação do texto. Isso também significa que apenas SPC e TAB são entendidos como delimitadores, mas esse é o caso de muitas implementações awk
, independentemente da localidade.
Algumas temporizações em um sistema multi-core amd64 GNU / Linux de zsh
:
$ (repeat 3000 printf '%s\n' {{,xx}{1..1000},xx}" blah blah blah")> a
$ wc a
6003000 24012000 119412000 a
$ time LC_ALL=C grep -Ec '^[[:blank:]]*xx([[:blank:]]|$)' < a
3000
LC_ALL=C grep -Ec '^[[:blank:]]*xx([[:blank:]]|$)' < a 0.15s user 0.03s system 99% cpu 0.175 total
$ time gawk '$1=="xx"{n++};END{print n}' < a
3000
gawk '$1=="xx"{n++};END{print n}' < a 2.00s user 0.05s system 99% cpu 2.055 total
$ time LC_ALL=C gawk '$1=="xx"{n++};END{print n}' < a
3000
LC_ALL=C gawk '$1=="xx"{n++};END{print n}' < a 1.96s user 0.03s system 99% cpu 1.985 total
$ time mawk '$1=="xx"{n++};END{print n}' < a
3000
mawk '$1=="xx"{n++};END{print n}' < a 1.23s user 0.04s system 99% cpu 1.277 total
$ time gawk '$1=="xx"' < a | wc -l
3000
gawk '$1=="xx"' < a 1.91s user 0.05s system 99% cpu 1.967 total
wc -l 0.00s user 0.00s system 0% cpu 1.967 total