每次我必须对字符串执行简单的包含或替换操作时,我正在搜索的术语是一个固定值,我发现如果我获取样本输入并对其进行一些分析,使用编译好的正则表达式几乎*总是比使用 String 类中的等效方法更快。
我尝试比较了多种方法(hs
是搜索的“大海捞针”,ndl
是搜索的“针”,repl
是替换值。regex
始终使用 RegexOptions.Compiled
选项创建):
hs.Replace( ndl, repl )
与regex.Replace( hs, repl )
hs.Contains( ndl )
与regex.IsMatch( hs )
我发现很多讨论都集中在这两种技术中哪种更快( 1 、 2 、 3 和许多其他技术),但这些讨论总是似乎专注于:
- 对简单操作使用字符串版本,对复杂操作使用正则表达式(从原始性能的角度来看,这似乎不一定是个好主意),或者
- 运行测试并比较两者(对于等效测试,正则表达式版本似乎总是表现更好)。
我不明白这怎么可能:正则表达式引擎如何比等效字符串版本更快地比较任意两个字符串的子字符串匹配?这似乎适用于非常小或非常大的搜索空间,或小或大的搜索词,或者搜索词在搜索空间中出现的较早或较晚。
那么,为什么正则表达式更快?
* 事实上,唯一 情况下,我设法证明字符串版本比编译的正则表达式更快是在搜索空字符串时!编译后的正则表达式处理任何其他情况,从单个字符串到非常长的字符串,都比等效的字符串方法处理得更快。
更新:添加了一个子句以阐明我正在查看搜索词在编译时已知的情况。对于动态或一次性操作,编译正则表达式的开销往往会使结果偏向于字符串方法。
最佳答案
I don't understand how this can possibly be the case: how does the regex engine compare any two strings for substring matches faster than the equivalent string version?
我可以想到两个原因:
- 正则表达式使用了一些智能算法,如 Boyer Moore (O(M/N)) 而简单的字符串操作只是将针与大海捞针中的每个位置进行比较 (O(N*M))。
- 他们并不是在做同样的事情。例如,一个人可能进行文化不变匹配,而另一个人进行文化相关匹配,这可能会产生性能差异。
关于c# - 为什么 C# 编译的正则表达式比等效的字符串方法更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12428776/