sed优化问题

sed优化问题

为什么是这样

sed -e '/\s.*$/ s///' -e '/\(.*\)/ s//\L\1/' > filename.txt

比这个更快?

sed -e 's/\s.*$//' -e 's/\(.*\)/\L\1/' > filename.txt

当我运行它们时,它们似乎做了几乎相同的事情,但是在幕后真正发生了什么变化使得一个比另一个更快?

更新: 版本:(GNU sed)4.4 输入数据大小:12GB

答案1

的第一次调用sed是将替换命令 ( s) 应用于使用正则表达式作为地址范围选择的一组行。

第二次调用应用与第一次相同的替换,但应用于输入数据的所有行,而不使用地址范围。

对 225 MiB 的电子邮件存档进行测试:

$ find . -type f -name "*.gz" -exec zcat {} + | time gsed -e '/\s.*$/ s///' -e '/\(.*\)/ s//\L\1/' >/dev/null
real    1m0,39s
user    0m49,69s
sys     0m10,53s

$ find . -type f -name "*.gz" -exec zcat {} + | time gsed -e 's/\s.*$//' -e 's/\(.*\)/\L\1/' >/dev/null
real    0m40,79s
user    0m34,02s
sys     0m7,85s

我运行了几次。所提供的时间具有代表性。

正如你所看到的,我得到了对面的你声称得到的结果。这可能是数据造成的。sed在相同的数据上测试 OpenBSD 时得到了类似的结果(使用稍微修改的表达式,因为您的表达式是 GNUsed特定的),尽管时间差异较小。

相关内容