如何使用grep高效检测二进制文件?解析实测性能差异
筛选非二进制文件的grep性能差异疑问
我需要批量筛选目录中的二进制文件,不想用file <filename>配合grep匹配"binary"/"executable"这类关键词(怕遗漏特殊情况),所以倾向于用grep的-I选项(该选项会自动跳过二进制文件)。
用以下命令可以列出所有非二进制文件:
grep -r -I -l . <directory>
但我发现这个命令执行耗时比预期长,于是针对不同实现方式做了性能测试(测试目录包含数千个递归文件),结果如下:
循环调用grep:
time { for f in $(find <dir> -type f); do grep -I -l . $f; done; }- 耗时:总耗时1分20秒,用户态20秒,内核态1分钟
循环调用grep并添加
-m 1(匹配到1次就停止扫描):time { for f in $(find <dir> -type f); do grep -I -l -m 1 . $f; done; }- 耗时:总耗时1分20秒,用户态20秒,内核态1分钟
- 疑问:
-m 1完全没提升性能,这是为什么?
grep递归扫描目录:
time { grep -r -I -l . <dir>; }- 耗时:总耗时12秒,用户态1.5秒,内核态2秒
- 疑问:用户态+内核态时间远小于总耗时,差值去哪了?
grep递归扫描并添加
-m 1:time { grep -r -I -l -m 1 . <dir>; }- 耗时:总耗时10秒,用户态0.1秒,内核态1.5秒
- 疑问:这次
-m 1明显提升了性能,和循环调用的情况完全不同,为什么?
我对grep的底层工作原理了解不够,没法解释这些性能差异。
内容的提问来源于stack exchange,提问作者David Simpson
相关产品推荐
相关产品推荐

