Sed optimization question

1

Por que isso é

sed -e '/\s.*$/ s///' -e '/\(.*\)/ s//\L/' > filename.txt

mais rápido que isso?

sed -e 's/\s.*$//' -e 's/\(.*\)/\L/' > filename.txt

Quando eu os executo, parece que eles fazem praticamente a mesma coisa, mas o que realmente muda sob o capô faz um mais rápido que o outro?

UPDATE: Versão: (GNU sed) 4.4 Tamanho dos dados de entrada: 12 GB

    
por HashWizard 14.05.2017 / 14:17

1 resposta

0

A primeira chamada de sed está aplicando os comandos de substituição ( s ) a um conjunto de linhas que são selecionadas usando uma expressão regular como um intervalo de endereços.

A segunda invocação aplica as mesmas substituições que a primeira, mas para todas as linhas dos dados de entrada sem usar intervalos de endereços.

Teste em 225 MiB de arquivos de e-mail:

$ find . -type f -name "*.gz" -exec zcat {} + | time gsed -e '/\s.*$/ s///' -e '/\(.*\)/ s//\L/' >/dev/null
real    1m0,39s
user    0m49,69s
sys     0m10,53s

$ find . -type f -name "*.gz" -exec zcat {} + | time gsed -e 's/\s.*$//' -e 's/\(.*\)/\L/' >/dev/null
real    0m40,79s
user    0m34,02s
sys     0m7,85s

Eu corri isso algumas vezes. Os tempos apresentados são representativos.

Como você pode ver, eu obtenho o formulário de resultados oposto ao que você diz ter recebido. Isso pode ser devido aos dados. Resultados semelhantes foram obtidos ao testar o OpenBSD sed nos mesmos dados, embora a diferença nos tempos fosse menor.

    
por 14.05.2017 / 15:39