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
两个方案的负荷为单一条纹(我用《圣经》的一份副本),制作了一个非三维单一条纹规则
运行在视觉工作室(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指出,净可对
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与更成熟的
您还应该记住,regex的性能高度依赖于源字符串和regex。有些regex引擎会花费大量的时间来分析regex,以便更快地浏览更多的源文本;只有在分析大量文本时才有意义的权衡。有些regex引擎以相对昂贵的扫描速度来换取匹配(因此匹配的数量会产生影响)。这里有大量的权衡;一对输入确实会使事情变得模糊不清。
所以要更明确地回答您的问题:这种变化在regex引擎中是正常的,不管它们是编译的还是解释的。看看上面的Boost测试,最快和最慢的实现之间的差异通常是数百倍——17x并不奇怪,这取决于您的用例。