首页 新闻 会员 周边

C#关于正则表达式Regex.Matches方法的计算效率

0
悬赏园豆:200 [已解决问题] 解决于 2017-01-13 16:02

在测试代码性能时,发现一个奇怪现象:

相关代码如下:

 1           Console.Write("-------------------- Regex --------------------\r\n");
 2             Run("Regex.IsMatch", () => { re.IsMatch(text); });
 3             Run("Regex.Match", () => { re.Match(text); });
 4             Run("Regex.Matches", () => { re.Matches(text); });
 5 
 6         static void Run(string title, Action action)
 7         {
 8             Stopwatch watch = new Stopwatch();
 9             watch.Start();
10             for (int i = 0; i < 100000; i++) {
11                 action();
12             }
13             watch.Stop();
14             Console.WriteLine(title + " : " + watch.ElapsedMilliseconds.ToString("N0") + "ms");
15         }

理论上方法的性能:IsMatch>Match>Matches

可是Matches的速度也太快了,快得有点不正常,求解惑。

ToolGood的主页 ToolGood | 菜鸟二级 | 园豆:206
提问于:2017-01-13 14:27
< >
分享
最佳答案
1

Matches还没计算呢,那时候只是一个matchcollection,真正计算是在你从这个collection拿结果的时候,这个和iqueryable一个道理。

收获园豆:150
Daniel Cai | 专家六级 |园豆:10424 | 2017-01-13 15:41
其他回答(2)
0

有点耍流氓.因为正则性能受表达式的影响太大.

不一样的表达式性能当然不一样.有的这个块有的那个块.

吴瑞祥 | 园豆:29449 (高人七级) | 2017-01-13 14:38

问题是,表达式是相同的,测试的文本是相同的。

完整代码在:https://github.com/toolgood/ToolGood.Words

支持(0) 反对(0) ToolGood | 园豆:206 (菜鸟二级) | 2017-01-13 14:44

@ToolGood: 我说的是一个表达式.由于结构问题.在不同的方法里他的性能表现是不一样的.

有的表达式IsMatch快,有的表达式Match块有的表达式Matches

他里面做的事情都是不一样的.不是像你想的那样先IsMatch再Match,Matches就是循环Match

不是的..

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2017-01-13 14:48

@吴瑞祥: 不同意你的说法,代码如下时,

            Run("Regex.Matches", () => {
                var ms = re.Matches(text);
                if (ms.Count == 0) {
                    throw new Exception("");
                }
            });

执行速度就开始龟速了

支持(0) 反对(0) ToolGood | 园豆:206 (菜鸟二级) | 2017-01-13 15:28

@ToolGood: ....语法书里都会告诉你抛异常对性能的影响非常大..

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2017-01-13 15:37
0

如果我的计算算法里面有一个热点数据处理的,你循环再多次,也只是执行一次而已。反正得出来的结果都是一样的。

收获园豆:50
盟怀部孩 | 园豆:878 (小虾三级) | 2017-01-13 15:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册