如何确定BASH中哪一种单行脚本选择更快?

时间:2014-10-27 10:32:35

标签: bash optimization

我有一个脚本,它在一周内运行了几百万次,它只是在一个名为file.csv的CSV字段中找到与$word完全匹配的第一个单元格,并打印整行,例如CSV:

robot@mechanical@a machine that does automated work
fish@animal@an animal that lives in the sea
tree@plant@a plant that grows in the forest

如果搜索“树”,则会打印出来:

tree@plant@a plant that grows in the forest

这两种方法得到的结果相同:

awk -F@ -v pattern="$word" '$1 ~ "^" pattern "$" {print; exit}' file.csv

grep ^$word@ file.csv | head -1

同样,这可以用来检查CSV的第二列中的完全匹配,假设有3列:

awk -F@ -v pattern="$word" '$2 ~ "^" pattern "$" {print; exit}' file.csv

grep ^.*@$word@.*@.*$ file.csv | head -1

如果选择了两个脚本,例如上面这个例子,它总能产生完全相同的输出,我怎样才能快速确定哪个更快?

3 个答案:

答案 0 :(得分:4)

通过测量来确定哪个更快。 time命令是您的第一站。

你应该花些时间吗?你如何定义“快速”?这显然取决于,但如果您希望大多数单词匹配,您可以计算文件中最后一行所需的时间。假设您在CSV文件中有999行,而第499行唯一包含“gollum”;

time grep -m 1 '^gollum@' file.csv >/dev/null
time awk -F @ '$1 ~ "gollum" { print; exit }' file >/dev/null

线长度是否大致均匀?你主要期望搜索失败吗?大多数匹配文件的开头?然后相应地调整您的实验。

一个常见的警告是磁盘I / O缓存会使重播更快。为了获得可比较的结果,请始终先执行虚拟运行,以确保为实际运行填充缓存。可能会重复运行几次每个实验,以便平衡系统负载的临时变化等。

您也可以解释您的问题。在其他条件相同的情况下,我希望grep更快,因为它在启动期间和处理每个输入行时都不会解析。但有时候在一个或另一个中进行优化(或者一个选择不当的表达式,最终将苹果与橙子进行比较,就像你上一篇grep一样)会抛弃这种常识性的结果。

答案 1 :(得分:3)

如果您真的关心效率,那么避免使用正则表达式进行完全匹配,并将两个提交用作:

awk -F'@' -v pattern="$word" '$1 == pattern{print; exit}' file.csv

grep -m1 -F "$word@" file.csv

要执行基准测试,请使用time命令:

time awk -F'@' -v pattern="$word" '$1 == pattern{print; exit}' file.csv

time grep -m1 -F "$word@" file.csv

答案 2 :(得分:0)

让它们在你的文件中循环运行约1个月,并打印两个脚本所需的时间(结束 - 开始)。一个会比另一个快。