在最近询问 Ubuntu 的一个关于检查某些文件是否具有不同内容的问题中,我看到一条评论指出,如果不同的部分不重要,那么cmp
速度会比diff
.这堆栈溢出答案cmp
同意,给出了在第一个不同字节处停止的原因。然而,GNUdiff
有-q
(或--brief
) 标志,应该使它成为report only when files differ
。diff
一旦发现任何差异,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
实时速度几乎是原来的两倍,并且在使用重复执行时保持更快的速度。