在最近关于检查某些文件是否具有不同内容的 Ask Ubuntu 问题中,我看到一条评论指出,如果不同的部分无关紧要,cmp
将比diff
. 这个堆栈溢出答案同意,给出了cmp
将在第一个不同字节处停止的原因。但是,GNUdiff
有-q
(or --brief
) 标志,它应该使它report only when files differ
. diff
一旦发现任何差异,GNU也将停止比较似乎是合乎逻辑的(例如grep
在指定-l
或时在第一个匹配之后停止搜索-q
)。
是cmp
真正的速度比diff -q
,在Linux系统的背景下,这可能有GNU版本?
使用来自Anthon 的类似但更大的文件(100M 行,仅在最后一个有所不同):
yes | head -n 100000000 >aa
sed '$ s/d/e/' >ab
Run Code Online (Sandbox Code Playgroud)
我得到了无法区分的时间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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这是在 Debian wheezy amd64 上,全部从 RAM 运行(在 tmpfs 上)。
cmp -s
具有被所有 POSIX 平台和 BusyBox 支持的优势。