C# Regex performance pure relative JS



我在 JS中的正则速度有很好的经验。

我决定进行小比较。我运行以下代码:

var str = "A regular expression is a pattern that the regular expression engine attempts to match in input text.";
var re = new RegExp("t", "g");
console.time();
for(var i = 0; i < 10e6; i++)
   str.replace(re, "1");
console.timeEnd();

结果: 3888.731MS

现在在C#中:

var stopwatch = new Stopwatch();
var str = "A regular expression is a pattern that the regular expression engine attempts to match in input text.";
var re = new Regex("t", RegexOptions.Compiled);
stopwatch.Start();
for (int i = 0; i < 10e6; i++)
    re.Replace(str, "1");
stopwatch.Stop();
Console.WriteLine( stopwatch.Elapsed.TotalMilliseconds);

结果: 32798.8756ms !!

现在,我尝试了 re.exec(str); vs Regex.Match(str, "t"); 1205.791ms vs 7352.532ms 有利于JS

是"不合适的"文本处理。在.net

中要完成

更新1使用[ta]模式的相同测试(而t字面):

3336.063ms in JS vs vs 64534.4766 !!! 在C#中。

另一个示例:

console.time();
var str = "A regular expression is a pattern that the regular expression engine attempts 123 to match in input text.";

var re = new RegExp("\d+", "g");
var result;
for(var i = 0; i < 10e6; i++)
    result = str.replace(str, "$0");
   
console.timeEnd();

3350.230ms 在JS中,vs 32582.405MS in C#。

String in C#是一种危险的野兽,如果您不小心使用它,您确实可以将自己开枪,但是我认为给定测试的代表不足以保证任何概括。

首先,我确实为您的测试案例复制了类似的性能。添加RegexOptions.Compiled将所需时间降低到30秒,但这仍然是显着差异。

特定的测试案例可能不是一个过于现实的,因为谁会将正则换用作单一char替换?如果您在此任务中使用专用API,您将获得可比较的结果str.Replace('t', '1');在我的计算机上为1600ms。

这意味着对于此特定任务C#性能与JS相当。C#Regex.Replace()是否在内部不适合替换单char,还是JS Regex版本正在优化正则票据 - 某些JS Guru应该回答。

更现实的复杂正则是有显着的差异 - 知道会很有趣。

编辑:我验证了当实际使用替换结果以及每个运行中的输入字符串不同时(我的测试中的10s vs 35s)时,性能差距仍然存在。所以差距很少,但仍然存在。

可能的原因

根据此提示,浏览器实现将一些字符串操作委托给优化的C 代码。如果他们这样做是为了弦乐,那么他们也可能是为了正面。AFAIK,C#REGEX ANS字符串课程留在托管世界中,这带来了一些行李。

JS Regex和.NET Regex之间差异很大的原因之一是JS缺乏许多高级功能,但是.NET非常富含功能。

这是regular-expressions.info的两个引号:

javaScript:

JavaScript实现PERL风格的正则表达式。但是,它缺少Perl和其他其他可用的高级功能现代正则表达口味:

no a或 z锚固以匹配字符串的开始或结尾。用一个商品或美元。

无原子分组或所有格量词。

没有Unicode支持,除了将单个字符与 uffff匹配。

没有命名的捕获组。改用编号捕获组。

没有模式修饰符可以在正则表达式中设置匹配选项。

没有条件。

没有正则表达评论。描述您的常规用JavaScript表达//评论,在常规之外表达式字符串。

.NET框架:

Microsoft .NET框架,您可以与任何.NET一起使用编程语言,例如c#(c sharp)或Visual Basic.net,具有对正则表达式的坚实支持。.NET的正则味道非常功能丰富。缺少的唯一值得注意的功能是所有格量词。

最新更新