简单的代码片段性能测试 -- 顺便测一下正则和异常的性能(使用循环测试做比较)

昨天,在群里.有人讨论正则很好,可以进行验证,就避免了异常的性能损耗.结果,顺着这个话题就谈论下来了. 有人说正则耗能也不少.有人说异常耗能也不多...

俺本着没有调查没有发言权的观点,进行了一下测试,结果差距如下:

单位(ms) 首次编译   第二次 第三次 第四次 第五次 重新编译
正则测试 0 0 0 0 0 0
异常测试 43 23 20 15 17 41  

循环测试

 10万次

0 0 0 0 0 0

循环测试

 100万次  

3 3 3 3 3 3  

循环测试

 1000万次

33 33 33 33 33 34

 

解释:

首次编译时,异常耗时非常之多, 循环10万次耗时是0ms,循环100万次是3ms.而且每次刷新很固定.没有变动.

而异常的第二次~第五次(是没有重新编译的). 刷新有变动. 基本徘徊在15~27ms之间. 而正则一直是0ms的稳定.

综上:异常的耗时还是非常之多的...(与循环测试做下比较就可知道)

 

以下是测试的代码片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public partial class RegexTest : System.Web.UI.Page
  {
      private const String TEST_DATA = "2009-02-40";
      protected void Page_Load(object sender, EventArgs e)
      {
          TestRegex();
          TestTryCatch();
          TestWhile();
      }
 
      private void TestWhile()
      {
          Stopwatch sw = new Stopwatch();
          sw.Start();
          for (int i = 0; i < 10000000; i++)
          { }
          sw.Stop();
          Label1.Text += "循环10000000测试用时:   " + sw.ElapsedMilliseconds + "ms" + "<br/>";
      }
      private void TestRegex()
      {
          Stopwatch sw = new Stopwatch();
          sw.Start();
          bool isDate = Regex.IsMatch(TEST_DATA, @"^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-9]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$");
          Label1.Text += "正则判断:" + (isDate == true ? "日期型数据" : "非日期型数据") + "<br/>";
          sw.Stop();
          Label1.Text += "正则测试用时:   " + sw.ElapsedMilliseconds + "ms" + "<br/>";
      }
 
      private void TestTryCatch()
      {
          Stopwatch sw = new Stopwatch();
          sw.Start();
          try
          {
              DateTime n = Convert.ToDateTime(TEST_DATA);
              Label1.Text += "异常判断:日期型数据<br/>";
          }
          catch
          {
              Label1.Text += "异常判断:非日期型数据<br/>";
          }
          sw.Stop();
          Label1.Text += "异常测试用时:   " + sw.ElapsedMilliseconds + "ms" + "<br/>";
      }
  }

posted @   Tweet  阅读(2187)  评论(17编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 上周热点回顾(1.20-1.26)
点击右上角即可分享
微信分享提示