regex - 流水线 sed 调用和多个 sed 表达式之间的效率是否存在差异?

标签 regex performance bash sed

我对 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')

这里有什么效率可以提高吗?

最佳答案

简答

使用多个表达式比使用多个管道更快,因为创建管道和 fork 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

当然,这不是针对大型输入文件、数千个输入文件进行测试,也不是在具有数万次迭代的循环中运行。不过,可以肯定地说,差异小到与大多数常见情况无关。

不常见的情况是另一回事。在这种情况下,基准测试将帮助您确定用内联表达式替换管道是否是对该用例有值(value)的优化。

关于regex - 流水线 sed 调用和多个 sed 表达式之间的效率是否存在差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11641333/

相关文章:

Javascript 部分号码匹配

algorithm - 你如何证明一个序列的大θ是它的首项?

bash - 使用 s3cmd 并行上传文件到 s3

linux - 使用列中的引用拆分文件

linux - 一个 Shell 脚本,用于在一个步骤中以文件夹名称作为参数查找并 cd 到文件夹中

Python:在字符串中查找一系列汉字并应用函数

regex - 从没有正则表达式的字符串中剪切 url

java - 如何插入代码使用尽可能多的 CPU 资源?

javascript - 随着游戏的进行,游戏循环出现滞后

c# - 正则表达式匹配 HTML 标签并提取文本