cmp 比 diff -q 更快吗?

cmp 比 diff -q 更快吗?

在最近询问 Ubuntu 的一个关于检查某些文件是否具有不同内容的问题中,我看到一条评论指出,如果不同的部分不重要,那么cmp速度会比diff.这堆栈溢出答案cmp同意,给出了在第一个不同字节处停止的原因。然而,GNUdiff-q(或--brief) 标志,应该使它成为report only when files differdiff一旦发现任何差异,GNU 也会停止比较,这似乎是合乎逻辑的(就像指定orgrep时在第一个匹配后停止搜索一样)。-l-q

在 Linux 系统中,cmp真的比 GNU 版本更快吗?diff -q

答案1

在@josten 的提示下,我对两者进行了比较。代码已开启GitHub。简而言之:

用户系统

真实的

用户+系统所花费的时间cmp -s似乎比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

两个文件,每行 1000 万行,每行 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实时速度几乎是原来的两倍,并且在使用重复执行时保持更快的速度。

相关内容