正则表达式与手动比较。哪个更快?

时间:2010-04-05 18:43:11

标签: regex performance parsing

在编写脚本引擎时,我有像(伪代码)

这样的函数
function is_whitespace?(char c){
  return c==' ' || c=='\t' || c=='\r' || c=='\n';
}

嗯,我的问题是大多数langugaes哪个更快?那或者使用正则表达式

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

我关注的主要语言是C#,C和Ruby,以防它完全依赖于平台。

5 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:3)

手动比较执行起来更快,正则表达式比较更快。

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

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

所以最后答案是“它取决于”。在某些情况下,保证使用过程代码的额外编程工作。在许多情况下,正则表达式足够快且易于维护。

答案 2 :(得分:1)

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

正则表达式表现不佳的领域是写得不好的正则表达式。提示是尽可能避免不必要的回溯,分组和更改。使用像“Regex Buddy”或Perl这样的“使用重新调试”来查看正则表达式所占的分支数。

这些链接涉及一些正则表达式性能问题。

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

Coding Horor- Regex

Java Performance - Regex

答案 3 :(得分:1)

在磁盘使用之后,当我分析我的代码时,正则表达式几乎总是我的性能瓶颈。即使对于简单的事情,例如.split(“”)。

答案 4 :(得分:0)

我不能谈论C#或C,但我不认为Ruby中的非正则表达式更快。<​​/ p>