É encontrar -iregex mais rápido do que usar múltiplos -o's?

1

Temos várias funções find definidas em nosso ambiente bash para excluir pastas (geralmente grandes ou geradas automaticamente) antes do grepping. Um exemplo de um desses é este:

function grepsrc()
{
    find . -type d -name .repo -prune -o \
           -type d -name .git  -prune -o \
           -type f -iregex '.*\.\(h\|c\|cc\|cpp\|S\|java\|xml\|sh\|mk\|aidl\|vts\)' \
           -exec grep --color=auto -n "$@" {} +
}

O uso de vários -o -iname seria mais rápido que o -iregex ?

function grepsrc()
{
    find . -type d \( -name .repo -o -name .git -o \) -prune -o \
           -type f \( -iname '*.h'    -o -iname '*.c'  -o -iname '*.cc'   -o \
                      -iname '*.cpp'  -o -iname '*.S'  -o -iname '*.java' -o \
                      -iname '*.xml'  -o -iname '*.sh' -o -iname '*.mk'   -o \
                      -iname '*.aidl' -o -iname '*.vts' \) \
           -exec grep --color=auto -n "$@" {} +
}

Nos meus próprios testes, o primeiro tem um tempo médio de

real    0m3.175s
user    0m3.021s
sys     0m0.145s

enquanto o último tem uma média de

real    0m3.170s
user    0m3.024s
sys     0m0.137s

Portanto, não há nenhuma diferença significativa no meu conjunto de dados, mas posso estar perdendo alguma coisa.

    
por OnlineCop 06.11.2017 / 17:24

1 resposta

1

Não há diferença significativa.

find é ligado por E / S, não vinculado à CPU. Qualquer operação de cadeia de caracteres, como globbing ou correspondência de expressão regular, será reduzida por operações de disco. Então, seu resultado acima é esperado.

O que pode (e normalmente afeta) find performance é a ordem dos testes. Por exemplo, se você estiver procurando por diretórios, mover -type d antes, digamos, -name tests pode acelerar as coisas informando find , não é necessário analisar os arquivos. Mas as alterações que afetam apenas a correspondência de nomes não têm nenhum efeito significativo na velocidade.

    
por 06.11.2017 / 17:53

Tags