![使用 time 和 tee 对 bash 命令进行基准测试](https://linux22.com/image/1571208/%E4%BD%BF%E7%94%A8%20time%20%E5%92%8C%20tee%20%E5%AF%B9%20bash%20%E5%91%BD%E4%BB%A4%E8%BF%9B%E8%A1%8C%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95.png)
我有一个目录,其中包含超过 80GB 的简单文本文件数据库,我预计需要经常对其进行 grep。出于这个原因,我尝试创建一些测试来比较 GNUgrep
与目前据我所知最快的替代方案 -ripgrep- 为了确定哪个可以最快地处理我的数据。
第一个测试将由三个循环组成,它们在一个 15GB 的文本文件上for
运行、和,而第二个测试将是对整个数据运行一系列相同的命令。经过几天的不断循环,我运用自己有限的知识、查找解决方案和排除错误,我设法为第一个测试拼凑了以下内容(这也将重新用于第二个测试):grep
rg
grep -F
bash
for i in {1..15}; \
do (time LC_ALL=C grep -i "ajndoandajskaskaksnaodnasnakdnaosnaond" "15gbfile.txt") 2>&1 |
tee -a "../grep Test 1.txt"; \
done; \
for i in {1..15}; \
do (time rg -i "ajndoandajskaskaksnaodnasnakdnaosnaond" "15gbfile.txt") 2>&1 |
tee -a "../ripgrep Test 1.txt"; \
done;
for i in {1..15}; \
do (time LC_ALL=C grep -Fi "ajndoandajskaskaksnaodnasnakdnaosnaond" "15gbfile.txt") 2>&1 |
tee -a "../grep -F Test 1.txt"; \
done;
它很丑陋,但它完全按照预期工作。它for
一个接一个地执行所有三个循环,每个循环对一个永远不会找到的长字符串进行 15 次 grep,然后将time
每个循环的输出打印到两个文件grep
中。STDOUT
但是,因为我正在进行基准测试,所以我想确保代码适合在 POSIX/bash/Cygwin 系统上准确测试我的用例的(相对)速度,并且我没有忽略任何会影响我得到的结果的因素。特别是诸如缓存、磁盘 IO 和其他我不知道的考虑因素之类的事情。我也欢迎任何可以使其表现得更稳健\看起来不那么丑陋的建议。
答案1
我认为您的测试有偏差,因为您运行这三个命令的时间截然不同。您应该有一个循环,依次运行 grep、rgrep、grep -F 命令,如果您可以随机排列顺序,那就更好了。
另一方面,性能并不是一切,我需要非常显著的更好的性能才能切换到特定的命令,并且即使在有偏差的基准测试中也会显示出更好的性能。