【问题标题】:Regex vs. Manual comparison. Which is faster?正则表达式与手动比较。哪个更快?
【发布时间】:2010-04-05 18:43:10
【问题描述】:

在编写脚本引擎时,我有(伪代码)之类的功能

function is_whitespace?(char c){
  return c==' ' || c=='\t' || c=='\r' || c=='\n';
}

好吧,我的问题是在大多数语言中哪个更快?或者使用正则表达式

function is_whitespace?(char c){
  return regex_match('\s',c);
}

我关心的主要语言是 C#、C 和 Ruby,如果它完全依赖于平台的话。

【问题讨论】:

  • 似乎很简单,可以进行快速测试以找出答案。生成一个充满随机字符的文件并将其传递给这两个函数。
  • 我认为你的意思是 '\s' 而不是 '\w'。
  • 是的,没错。不过,Mono 必须满足 C# 测试的需要。
  • @sepp2k,是的,你是对的。我在想 w=whitespace 而不是 s=space..

标签: regex performance parsing


【解决方案1】:

当然,四个小块内存的比较比构建、运行和销毁状态机要快得多(并且几乎不使用内存)。

【讨论】:

  • +1。请注意,更复杂的示例使用正则表达式可能会更快。
  • 我的猜测永远不会,但是与编写正则表达式相比,为常规语言手动编写匹配器可能会变得非常复杂。
  • 当然,这假设您构建了“手动比较”引擎,这样它就不会进行比需要更多的比较。最终这无论如何都会简化为状态机。
  • @Earlz:首先,有些人倾向于将正则表达式用于可以通过比较和子字符串检索编写的内容。其次,任何足够复杂的正则表达式都不能只用语言结构重写,并且保持可读性和可支持性。
  • @Earlz - 对于这个特定的测试,正则表达式将是矫枉过正。但是正则表达式非常有用……例如,如果您的 is_whitespace 函数是与正则表达式执行类似操作的类的一部分,则您可以用一些正则表达式匹配替换整个类内容。但是,如果您只对执行速度感兴趣,那么用于微不足道的精确匹配的正则表达式就有点过头了。
【解决方案2】:

手动比较执行速度更快,正则表达式比较键入速度更快。

请注意,如果您的系统使用 Unicode,则您的两个实现是不等价的。正则表达式 \s 匹配所有 Unicode 空白,而您的手动比较仅处理基本 ASCII,甚至不包括通常也被视为空白的垂直制表符和换页符。

如果您使用高级语言编写此代码,我建议您使用您的编程语言库已经提供的 is_whitespace() 函数。几乎总是包含这样的基本功能。

所以最终答案是“视情况而定”。在某些情况下,需要使用过程代码进行额外的编程工作。在许多情况下,正则表达式足够快且更易于维护。

【讨论】:

  • 这不取决于您的 Regex 实现是否支持 unicode 吗? (还有你的语言。例如,我认为 Ruby 仍然不支持 unicode)
  • 我说:“如果你的系统使用 Unicode”。我的意思是编程语言和正则表达式。 Ruby 1.8 中的正则表达式不支持 Unicode,Ruby 1.9 中的支持。
【解决方案3】:

在大多数情况下,查找类似空格字符的正则表达式非常快。您有很多关注领先的正则表达式实现中的性能的眼球,并且可能还有其他“低悬的果实”领域可以在代码的其他领域进行优化。

正则表达式表现不佳的领域是写得不好的正则表达式。提示是尽可能避免不必要的回溯、分组和更改。使用“Regex Buddy”之类的东西或带有“use re debug”的Perl来查看你的正则表达式有多少分支。

这些链接指向一些正则表达式性能问题。

如果有疑问,做比较时间...

Coding Horor- Regex

Java Performance - Regex

【讨论】:

    【解决方案4】:

    在磁盘使用之后,当我分析我的代码时,正则表达式几乎总是我的性能瓶颈。即使是像 .split(" ") 这样简单的东西。

    【讨论】:

      【解决方案5】:

      我不能谈论 C# 或 C,但我不认为非正则表达式形式在 Ruby 中更快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-27
        • 2021-12-29
        • 1970-01-01
        • 2016-10-19
        • 1970-01-01
        • 1970-01-01
        • 2017-10-08
        相关资源
        最近更新 更多