特定のファイルの内容が異なるかどうかを確認する方法について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のプロンプトに従って2つを比較しました。コードが有効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
リアルタイムスピードはほぼ2倍速く、繰り返し実行を使用すると高速です。