【发布时间】:2018-05-30 14:52:52
【问题描述】:
我对@987654321@的正则表达式速度有很好的体验。
我决定做一个小比较。我运行了以下代码:
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 文字)更新 1 个相同的测试:
3336.063ms in js VS 64534.4766!!! in 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();
js 中的 3350.230ms,c# 中的 32582.405ms。
【问题讨论】:
-
你试过c#中的预编译正则表达式吗?
-
我能够重现 c# 性能,Release/Any CPU (64 bit)/Not Running in Visual Studio。我使用 RegexOptions.None 的时间:46509.2514 毫秒。我使用 RegexOptions.Compiled 的时间:36174.9981 毫秒。
-
分配 str.replace(re, "1");以确保 JS 不会将其视为无操作并对其进行优化
-
@AlexK。
result = str.replace(str, "1");= 3026.953ms -
好的,但是,我不明白为什么更新 2 测试“更有用”。顺便说一句,当您在
RegExp构造函数的双引号字符串中写入\d+时,它被解释为d+(无意义的转义被简单地忽略,下一个字符被视为文字)。要在双引号字符串中计算\d字符类,您必须使用两个反斜杠:var re=RegExp("\\d+", "g");。注意写var re=/\d+/g;或var re=RegExp(/\d+/g);是完全一样的(这些版本都不是更早或更晚编译的。)
标签: javascript c# .net regex text-processing