특정 파일의 내용이 다른지 확인하는 방법에 대해 Ubuntu에 묻는 최근 질문에서 다른 부분이 중요하지 cmp
않으면 diff
.스택 오버플로 답변cmp
동의합니다. 첫 번째 다른 바이트에서 중지하는 이유가 제공됩니다. 그러나 GNU에는 그렇게 만드는 (또는 ) 플래그가 diff
있습니다 . 차이점이 발견되자마자 GNU도 비교를 중지하는 것은 논리적인 것처럼 보입니다( 또는이 지정되면 첫 번째 일치 후 검색을 중지하는 것과 같습니다).-q
--brief
report only when files differ
diff
grep
-l
-q
Linux 시스템의 GNU 버전보다 정말 빠른가요 cmp
?diff -q
답변1
@josten의 프롬프트에 따라 두 가지를 비교했습니다. 코드가 활성화되었습니다GitHub. 간단히 말해서:
cmp -s
User+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
실시간 속도는 거의 두 배 빠르며 반복 실행을 사용할 때 더 빠릅니다.