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

Regex 正则表达式与手动比较。哪个更快?,regex,performance,parsing,Regex,Performance,Parsing,在编写脚本引擎时,我有如下功能(psuedo代码) 好吧,我的问题是,在大多数语言中哪一种更快?或使用类似regex的 function is_whitespace?(char c){ return regex_match('\s',c); } 我关心的主要语言是C#、C和Ruby,如果它完全依赖于平台的话 当然,与构建、运行和销毁状态机相比,对小块内存进行四次比较要快得多(而且几乎不使用内存)。在大多数情况下,正则表达式查找类似空格字符的字符非常快。您有很多眼球在关注领先的正则表达式实现

在编写脚本引擎时,我有如下功能(psuedo代码)

好吧,我的问题是,在大多数语言中哪一种更快?或使用类似regex的

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

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

当然,与构建、运行和销毁状态机相比,对小块内存进行四次比较要快得多(而且几乎不使用内存)。在大多数情况下,正则表达式查找类似空格字符的字符非常快。您有很多眼球在关注领先的正则表达式实现中的性能,并且在代码的其他方面可能还有其他需要优化的“低挂果实”

正则表达式性能差的地方是编写得很差的正则表达式。提示是尽可能避免不必要的回溯、分组和更改。使用“Regex Buddy”或带有“Use-re-debug”的Perl来查看您的Regex执行了多少个分支

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

如果有疑问,请进行比较计时


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

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

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


因此,最终的答案是“视情况而定”。在某些情况下,使用过程代码的额外编程工作是有保证的。在许多情况下,正则表达式速度足够快且易于维护。

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

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

似乎足够简单,可以快速进行测试来找到答案。生成一个满是随机字符的文件,并通过两个函数传递它。我想你的意思是“\s”而不是“\w”。是的,这是真的。。Mono必须满足C测试的要求。@sepp2k,是的,你是正确的。我想的是w=空格而不是s=空格..+1。请注意,更复杂的示例可能会更快地使用正则表达式。我的猜测是永远不会,但与编写正则表达式相比,手工编写常规语言的匹配器可能会变得非常复杂。当然,这假设您构建了“手动比较”引擎,以便它不会进行比需要更多的比较。总之,这最终会变成一个状态机。@Earlz:首先,有些人倾向于使用正则表达式来处理可以通过比较和子字符串检索编写的内容。第二,任何足够复杂的正则表达式都不能仅在语言构造中重写,并且保持可读性和可支持性。@Earlz-对于这个特定的测试,正则表达式是多余的。但是正则表达式非常有用。。。例如,如果您的is_whitespace函数是一个类的一部分,该类的功能与regex类似,那么您可以用几个regex匹配项替换整个类的内容。但是,如果您感兴趣的只是简单的执行速度,那么对于一个微不足道的精确匹配来说,使用正则表达式就太过分了。这不取决于您的正则表达式实现是否支持unicode吗?(还有你的语言。例如,我认为Ruby仍然不了解unicode)我说:“如果你的系统使用unicode”。我指的是编程语言和regex风格。Ruby1.8中的正则表达式不支持Unicode,Ruby1.9中的正则表达式支持Unicode。
function is_whitespace?(char c){
  return regex_match('\s',c);
}