我曾在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
要做大量的文字处理“不适合”的主题?
[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#。
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字符串类留在管理的世界,带来了一些行李。
其中一个原因JS正则表达式和.NET的正则表达式之间的最大区别在于,JS缺乏相当数量的先进功能,但是.NET是非常丰富的功能。
下面是从regular-expressions.info
两个单引号:
JavaScript的执行Perl样式的正则表达式。但是,它缺乏相当数量的在Perl和其他现代的正则表达式的口味提供先进的功能:
否\ A或\ Z ^锚匹配字符串的开头或结尾。使用插入符号或美元来代替。
没有原子团或占有欲量词。
不支持Unicode,除了以\ uFFFF匹配单个字符。
没有命名的捕获组。使用编号的捕获组来代替。
没有模式修饰符来设置相匹配的正则表达式中的选项。
没有条件语句。
非正则表达式的意见。描述你的JavaScript正则表达式//注释代替,正则表达式的字符串之外。
Microsoft .NET框架,你可以用任何.NET编程语言使用诸如C#(升C)或Visual Basic.NET中,对正则表达式的固相载体。 .NET的正则表达式的味道很丰富的功能。缺乏真实,唯一值得注意的特点是占有欲量词。