É cmp mais rápido que diff -q?

6

Em uma pergunta recente do Ubuntu sobre a verificação de alguns arquivos com conteúdo diferente, vi um comentário afirmando que, se as seções diferentes não importassem, cmp seria mais rápido que diff . Essa resposta de estouro de pilha concorda, indicando o motivo pelo qual cmp pararia no primeiro byte diferente. No entanto, o% GNUdiff tem o sinalizador -q (ou --brief ), que deve torná-lo report only when files differ . Parece lógico que o GNU diff também pare de comparar uma vez que qualquer diferença seja encontrada (como grep pararia de procurar após a primeira correspondência quando -l ou -q fosse especificado).

O cmp é realmente mais rápido que diff -q , no contexto dos sistemas Linux, que provavelmente terão a versão GNU?

    
por muru 02.09.2014 / 11:14

3 respostas

10

Solicitado por @josten, fiz uma comparação entre os dois. O código está em GitHub . Em resumo 1 :

O tempo do User + Sys tirado por cmp -s pareceu ser um pouco mais do que o de diff na maioria dos casos. No entanto, o tempo real foi praticamente arbitrário - cmp à frente em alguns, diff à frente em alguns.

Resumo:

Qualquer diferença no desempenho é pura coincidência. Use o que você quiser.

1 As imagens são 1920x450, então abra-as em uma guia para vê-las em toda a sua glória.

    
por 03.09.2014 / 20:53
4

Usando arquivos semelhantes, mas maiores, de Anthon (linhas de 100 milhões, com diferença apenas no último) :

yes | head -n 100000000 >aa
sed '$ s/d/e/' >ab

Eu obtenho tempos indistinguíveis para diff -q e cmp -s :

/tmp% time diff -q aa ab
Files aa and ab differ
diff -q aa ab  0.04s user 0.33s system 99% cpu 0.370 total
/tmp% time cmp -s aa ab
cmp -s aa ab  0.04s user 0.36s system 99% cpu 0.403 total

cmp é mais lento que cmp -s . Presumivelmente, contar os números de linha é um fardo significativo.

/tmp% time cmp aa ab
aa ab differ: char 499999999, line 100000000
cmp aa ab  0.84s user 0.36s system 97% cpu 1.225 total

Isto está no Debian wheezy amd64, todos rodando a partir da RAM (no tmpfs).

cmp -s tem a vantagem de ser suportado por todas as plataformas POSIX e pelo BusyBox.

    
por 03.09.2014 / 01:44
2

Não, diff -q parece ser mais rápido e você pode testar isso com facilidade:

$ wc x1 x2
 10000000  10000000  50000000 x1
 10000000  10000000  50000000 x2
 20000000  20000000 100000000 total

Dois arquivos com 10 milhões de linhas de 4 caracteres cada.

$ cat x1 x2 > /dev/null
$ diff x1 x2
9999999c9999999
< abcd
---
> abce

Diferindo apenas no anterior à última linha.

$ time diff -q x1 x2
Files x1 and x2 differ

real    0m0.043s
user    0m0.012s
sys     0m0.031s

$ time cmp x1 x2
x1 x2 differ: byte 49999994, line 9999999

real    0m0.085s
user    0m0.048s
sys     0m0.036s

diff -q é quase duas vezes mais rápido em tempo real e permanece mais rápido quando se utiliza uma execução repetida.

    
por 02.09.2014 / 13:16