cmp は diff -q より高速ですか?

cmp は diff -q より高速ですか?

特定のファイルの内容が異なるかどうかを確認する方法についてUbuntuに尋ねる最近の質問で他の部分が重要でないcmp場合diffスタックオーバーフロー回答cmp同意します。最初の別のバイトで停止する理由が提供されます。ただし、GNUにはそのような(または)フラグがdiffあります。違いが見つかるとすぐに、GNUも比較を停止するのは論理的なようです(または、指定された場合は最初の一致後に検索を停止するのと同じです)。-q--briefreport only when files differdiffgrep-l-q

LinuxシステムのGNUバージョンより本当に速いですかcmpdiff -q

答え1

@jostenのプロンプトに従って2つを比較しました。コードが有効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リアルタイムスピードはほぼ2倍速く、繰り返し実行を使用すると高速です。

関連情報