【问题标题】:Disabling backreferences in perl在 perl 中禁用反向引用
【发布时间】:2012-07-30 08:02:52
【问题描述】:

有人告诉我,在 perl 中禁用反向引用可以提高性能(前提是您没有使用它们),并且如果您不使用任何反向引用 perl 将自行完成。

现在我有一个包含大量正则表达式的 perl 脚本,只有一个使用反向引用,我想知道以下内容:

  • 鉴于我有大量的正则表达式(假设我的大部分处理时间是正则表达式)禁用反向引用是否会显着提高性能?或者有什么标准可以用来判断是否是这种情况?
  • 有没有一种方法可以在开始时禁用反向引用,只在需要时才重新启用它(我知道 (?:,但我不想将它添加到每个分组中)?
  • 作用域是否允许 perl 为我优化这种反向引用行为(即,subeval 是否会更改 perl 是否关闭外部事物的反向引用)?

【问题讨论】:

  • »假设我的大部分处理时间都是正则表达式« O RLY? Profile(反对)证明你的假设。我敢打赌你的程序很重要,不会大部分时间都花在正则表达式上。

标签: regex perl performance


【解决方案1】:

使用捕获括号只会惩罚使用它们的正则表达式,因此请在需要捕获的地方使用它们,但在您只需要分组时使用非捕获括号(?:...)

使用任何全局匹配变量

$` $& $'

all 正则表达式施加性能损失,因此请尽可能避免使用它们。 (但是一旦你这样做了,就发疯了!你已经付出了代价。)没有办法打开和关闭它。一旦 Perl 检测到它们被用于任何地方(甚至在您可能使用的第三方模块中),该功能就会被打开。

从 Perl 5.10.0 开始,全局匹配变量有一些替代方案,它们只惩罚使用它们的正则表达式。如果您将 /p 修饰符添加到特定的正则表达式,您可以使用

${^PREMATCH} ${^MATCH} ${^POSTMATCH}

改为。

【讨论】:

    【解决方案2】:

    唯一真正的检查方法是自己分析它。看看Benchmark 模块(它在核心 perl 中,所以你不必安装它)。设置几个基准:一个是你的函数有(比如说)十个没有任何反向引用的正则表达式,另一个是有相同的十个但其中一个使用反向引用。

    如果您发现包含反向引用的正则表达式确实减慢了其余正则表达式的速度,也许可以尝试重写该正则表达式以不以某种方式包含反向引用...?

    【讨论】:

    • 所以,基准测试可以帮助我为这段特定的代码做出这个决定,但我希望获得一些信息,以便我可以更轻松地做出这个决定。这里的底线是,我不太了解禁用/启用反向引用,我正在尝试获取更多信息,以便做出明智的决定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多