在测试代码性能时,发现一个奇怪现象:
相关代码如下:
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的速度也太快了,快得有点不正常,求解惑。
Matches还没计算呢,那时候只是一个matchcollection,真正计算是在你从这个collection拿结果的时候,这个和iqueryable一个道理。
有点耍流氓.因为正则性能受表达式的影响太大.
不一样的表达式性能当然不一样.有的这个块有的那个块.
问题是,表达式是相同的,测试的文本是相同的。
完整代码在:https://github.com/toolgood/ToolGood.Words
@ToolGood: 我说的是一个表达式.由于结构问题.在不同的方法里他的性能表现是不一样的.
有的表达式IsMatch快,有的表达式Match块有的表达式Matches
他里面做的事情都是不一样的.不是像你想的那样先IsMatch再Match,Matches就是循环Match
不是的..
@吴瑞祥: 不同意你的说法,代码如下时,
Run("Regex.Matches", () => { var ms = re.Matches(text); if (ms.Count == 0) { throw new Exception(""); } });
执行速度就开始龟速了
@ToolGood: ....语法书里都会告诉你抛异常对性能的影响非常大..
如果我的计算算法里面有一个热点数据处理的,你循环再多次,也只是执行一次而已。反正得出来的结果都是一样的。