Benchmarking bash comandos com tempo e tee

1

Eu tenho um diretório contendo mais de 80 GB de bancos de dados de arquivos de texto simples que eu espero que precisem passar com frequência. Por esta razão, estou tentando criar alguns testes para comparar o GNU grep com o que, até onde eu sei, é a alternativa mais rápida atualmente em estado selvagem - ripgrep - para determinar qual funcionará mais rapidamente com meus dados.

O primeiro teste consistirá em três for loops que executam grep , rg e grep -F em um arquivo de texto de 15 GB, e o segundo teste será uma série dos mesmos comandos executados em todo o os dados. Depois de alguns dias de ciclismo constante entre empregar meu próprio conhecimento limitado de bash , procurando soluções e erros de solução de problemas, consegui hackear o seguinte para o primeiro teste (que também será reaproveitado para o segundo teste) :

for i in {1..15}; \
do (time LC_ALL=C grep -i "ajndoandajskaskaksnaodnasnakdnaosnaond" "15gbfile.txt") 2>&1 | 
tee -a "../grep Test 1.txt"; \
done; \
for i in {1..15}; \
do (time rg -i "ajndoandajskaskaksnaodnasnakdnaosnaond" "15gbfile.txt") 2>&1 |
tee -a "../ripgrep Test 1.txt"; \
done;
for i in {1..15}; \
do (time LC_ALL=C grep -Fi "ajndoandajskaskaksnaodnasnakdnaosnaond" "15gbfile.txt") 2>&1 |
tee -a "../grep -F Test 1.txt"; \
done;

É feio, mas funciona exatamente como pretendido. Ele executa todos os três for loops um após o outro, cada um aplicando 15 vezes para uma string longa que nunca será encontrada e imprimindo a saída de time para cada grep para STDOUT e um arquivo .

No entanto, como estou fazendo benchmarking, quero ter certeza de que o código é adequado para testar com precisão as velocidades (relativas) dos meus casos de uso em um sistema POSIX / bash / Cygwin e que não há nada que eu esteja negligenciando isso distorceria os resultados que recebo. Em particular, coisas como cache, E / S de disco e outras considerações das quais não conheço. Eu também gostaria de receber sugestões que fariam com que ele se comportasse de maneira mais robusta \ pareça menos feia.

    
por Hashim 25.09.2018 / 01:08

1 resposta

1

IMHO você teste é tendencioso, porque você está executando os três comandos em tempos muito diferentes. Você deve ter um único loop que execute sucessivamente os comandos grep, rgrep, grep -F, e se você puder fazer essa ordem aleatoriamente, isso será até melhor.

Por outro lado, o desempenho não é tudo, e eu precisaria de um desempenho muito significativo para mudar para um comando específico, e esse melhor desempenho seria mostrado mesmo com benchmarks de tendência.

    
por 25.09.2018 / 09:15