C#正则表达式的性能相对于纯JS

问题描述 投票:6回答:2

我曾在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要做大量的文字处理“不适合”的主题?

UPDATE 1 [ta]图案(而不是t字面)同样的试验:

3336.063ms在爵士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在C#。

javascript c# .net regex text-processing
2个回答
3
投票

String在C#是一个危险的野兽,你真的可以拍摄自己,如果你使用它不小心脚下,但我不认为给定的测试足以保证任何概括代表。

首先,我没有重现的测试案例类似的性能。添加RegexOptions.Compiled减少了所需的时间为30十岁上下秒,但是这仍然是显著差异。

具体的测试用例可能不是太现实的,因为谁也使用单个字符的正则表达式替换?如果您使用的是专用的API完成这个任务,你会得到类似的结果str.Replace('t', '1');是我的机器上1600ms之间。

这意味着这个特定的任务C#性能与JS。无论是C#Regex.Replace()是内部有点不适合单字符替换,或者如果JS正则表达式版本是优化正则表达式了 - 一些JS大师应该回答这个问题。

将一个更现实的复杂的正则表达式有一个显着的差异 - 将是有趣的了解。

编辑:我证实,当取代结果实际使用,当输入字符串中的每个运行不同(10S 35S VS在我的测试)保持的性能差距。所以差距是少了,但仍然存在。

可能的原因

根据从this SO question浏览器实现委托一些字符串操作来优化的C ++代码提示。如果他们这样做了字符串连接,他们可能做到这一点对正则表达式为好。据我所知,C#正则表达式ANS字符串类留在管理的世界,带来了一些行李。


1
投票

其中一个原因JS正则表达式和.NET的正则表达式之间的最大区别在于,JS缺乏相当数量的先进功能,但是.NET是非常丰富的功能。

下面是从regular-expressions.info两个单引号:

JavaScript

JavaScript的执行Perl样式的正则表达式。但是,它缺乏相当数量的在Perl和其他现代的正则表达式的口味提供先进的功能:

否\ A或\ Z ^锚匹配字符串的开头或结尾。使用插入符号或美元来代替。

没有原子团或占有欲量词。

不支持Unicode,除了以\ uFFFF匹配单个字符。

没有命名的捕获组。使用编号的捕获组来代替。

没有模式修饰符来设置相匹配的正则表达式中的选项。

没有条件语句。

非正则表达式的意见。描述你的JavaScript正则表达式//注释代替,正则表达式的字符串之外。

.NET Framework

Microsoft .NET框架,你可以用任何.NET编程语言使用诸如C#(升C)或Visual Basic.NET中,对正则表达式的固相载体。 .NET的正则表达式的味道很丰富的功能。缺乏真实,唯一值得注意的特点是占有欲量词。

© www.soinside.com 2019 - 2024. All rights reserved.