C ++ vs .NET正则表达式性能

C++ vs .NET regex performance

Propted by a comment from Konrad Rudolph on a related question,I wrote the following program to benchmark regular expression performance in F 350;:

1
2
3
4
5
6
7
8
9
open System.Text.RegularExpressions
let str = System.IO.File.ReadAllText"C:\\Users\\Jon\\Documents\\pg10.txt"
let re = System.IO.File.ReadAllText"C:\\Users\\Jon\\Documents\
e.txt"

for _ in 1..3 do
  let timer = System.Diagnostics.Stopwatch.StartNew()
  let re = Regex(re, RegexOptions.Compiled)
  let res = Array.Parallel.init 4 (fun _ -> re.Split str |> Seq.sumBy (fun m -> m.Length))
  printfn"%A %fs" res timer.Elapsed.TotalSeconds

And the equivalent in C++:

ZZU1

两个方案的负荷为单一条纹(我用《圣经》的一份副本),制作了一个非三维单一条纹规则\w?\w?\w?\w?\w?\w,并将四条条纹分割成平行的平行线,使用的是分割条纹长度的总和(以避免分割)。

运行在视觉工作室(with MP and openmp enabled for the C+),在释放目标64-bit,the C+takes 43.5s and the F 35s;takes 3.28s(over 13x faster).这一点我并不感到惊讶,因为我相信,在C++STDLIB解释的地方,净JIT编纂了原住民法典,但我喜欢一些同类评论。

复制这个网站码到您的网站上以设置一个投票箱在您的网站上。

编辑:Billy Oneal指出,净可对\w有不同的解释。

1
[0-9A-Za-z_]?[0-9A-Za-z_]?[0-9A-Za-z_]?[0-9A-Za-z_]?[0-9A-Za-z_]?[0-9A-Za-z_]

This actually makes the net code substantially faster(C++is the same),reducing the time from 3.28s to 2.38s for F ;(over 17x faster).


这些基准实际上不是可比的——C++和.NET实现完全不同的正则表达式语言(ECMAScript与Perl),并由完全不同的正则表达式引擎提供动力。.NET(据我所知)正在从greta项目中获益,该项目产生了一个非常棒的正则表达式引擎,已经调优了多年。比较中的C++ EDCOX1 0是最近添加的(至少在MSVC++上,我假设您使用的是非标准类型EDCOX1,1和朋友)。

您可以在这里看到greta与更成熟的std::regex实现boost::regex的对比(尽管该测试是在Visual Studio 2003上完成的)。

您还应该记住,regex的性能高度依赖于源字符串和regex。有些regex引擎会花费大量的时间来分析regex,以便更快地浏览更多的源文本;只有在分析大量文本时才有意义的权衡。有些regex引擎以相对昂贵的扫描速度来换取匹配(因此匹配的数量会产生影响)。这里有大量的权衡;一对输入确实会使事情变得模糊不清。

所以要更明确地回答您的问题:这种变化在regex引擎中是正常的,不管它们是编译的还是解释的。看看上面的Boost测试,最快和最慢的实现之间的差异通常是数百倍——17x并不奇怪,这取决于您的用例。