cmp가 diff -q보다 빠르나요?

cmp가 diff -q보다 빠르나요?

특정 파일의 내용이 다른지 확인하는 방법에 대해 Ubuntu에 묻는 최근 질문에서 다른 부분이 중요하지 cmp않으면 diff.스택 오버플로 답변cmp동의합니다. 첫 번째 다른 바이트에서 중지하는 이유가 제공됩니다. 그러나 GNU에는 그렇게 만드는 (또는 ) 플래그가 diff있습니다 . 차이점이 발견되자마자 GNU도 비교를 중지하는 것은 논리적인 것처럼 보입니다( 또는이 지정되면 첫 번째 일치 후 검색을 중지하는 것과 같습니다).-q--briefreport only when files differdiffgrep-l-q

Linux 시스템의 GNU 버전보다 정말 빠른가요 cmp?diff -q

답변1

@josten의 프롬프트에 따라 두 가지를 비교했습니다. 코드가 활성화되었습니다GitHub. 간단히 말해서:

사용자 시스템

진짜

cmp -sUser+System은 대부분의 경우 보다 시간이 조금 더 걸리는 것 같습니다 diff. 그러나 실시간 촬영은 거의 임의적입니다. cmp일부는 리드이고 diff일부는 리드입니다.

요약:
모든 성능 차이는 순전히 우연입니다. 원하는 것을 사용하십시오.

답변2

비슷하지만 더 큰 파일을 사용하세요.안톤(100M 라인, 마지막 라인만 다름):

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

내가 얻은 시간 diff -q과 구별할 수 없는 시간은 다음과 같습니다 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보다 느립니다 cmp -s. 아마도 행 수를 세는 것은 큰 부담이 될 것입니다.

/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

이것은 Debian wheezy amd64에 있으며 모두 RAM(tmpfs)에서 실행됩니다.

cmp -s모든 POSIX 플랫폼과 BusyBox에서 지원된다는 장점이 있습니다.

답변3

아니요, diff -q더 빠른 것 같습니다. 쉽게 테스트할 수 있습니다.

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

파일 2개, 각각 1,000만 줄, 줄당 4자.

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

마지막 줄 이전에만 다릅니다.

$ 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실시간 속도는 거의 두 배 빠르며 반복 실행을 사용할 때 더 빠릅니다.

관련 정보