我在 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的正则味道非常功能丰富。缺少的唯一值得注意的功能是所有格量词。