我有一个关于 bash 中 sed 效率的问题。我有一系列管道化的 sed 语句,例如:
var1="Some string of text"
var2=$(echo "$var1" | sed 's/pattern1/replacement1/g' | sed 's/pattern2/replacement2/g' | sed 's/pattern3/replacement3/g' | sed 's/pattern4/replacement4' | sed 's/pattern5/replacement5/g')
假设没有输入依赖于早期 sed 管道的编辑输出,我是否最好使用表达式语句编写上述脚本?例如:
var2=$(echo "$var1" | sed -e's/pattern1/replacement1/g' -e's/pattern2/replacement2/g' -e's/pattern3/replacement3/g' -e's/pattern4/replacement4/g' -e's/pattern5/replacement5/g')
这里可以提高效率吗?
简答
使用多个表达式比使用多个管道更快,因为创建管道和分叉 sed 进程会产生额外的开销。然而,在实践中,这种差异很少足以产生影响。
基准测试
使用多个表达式比多个管道更快,但对于平均用例来说可能还不够重要。以您的示例为例,执行速度的平均差异仅为千分之二秒,这还不足以令人兴奋。
# Average run with multiple pipelines.
$ time {
echo "$var1" |
sed 's/pattern1/replacement1/g' |
sed 's/pattern2/replacement2/g' |
sed 's/pattern3/replacement3/g' |
sed 's/pattern4/replacement4/g' |
sed 's/pattern5/replacement5/g'
}
Some string of text
real 0m0.007s
user 0m0.000s
sys 0m0.004s
# Average run with multiple expressions.
$ time {
echo "$var1" | sed \
-e 's/pattern1/replacement1/g' \
-e 's/pattern2/replacement2/g' \
-e 's/pattern3/replacement3/g' \
-e 's/pattern4/replacement4/g' \
-e 's/pattern5/replacement5/g'
}
Some string of text
real 0m0.005s
user 0m0.000s
sys 0m0.000s
当然,这不是针对大型输入文件、数千个输入文件进行测试,也不是在具有数万次迭代的循环中运行。不过,似乎可以肯定地说,这种差异足够小,对于大多数常见情况来说无关紧要。
不常见的情况则是另一回事。在这种情况下,基准测试将帮助您确定用内联表达式替换管道是否是一种有价值的优化对于该用例.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)