我有一个脚本,它在一周内运行了几百万次,它只是在一个名为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
如果选择了两个脚本,例如上面这个例子,它总能产生完全相同的输出,我怎样才能快速确定哪个更快?
答案 0 :(得分:4)
通过测量来确定哪个更快。 time
命令是您的第一站。
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个月,并打印两个脚本所需的时间(结束 - 开始)。一个会比另一个快。