摘要:说到C#的Regex,谈到最多的应该就是RegexOptions.Compiled这个东西,传说中在匹配速度方面,RegexOptions.Compiled是可以提升匹配速度的,但在启动速度上,使用了RegexOptions.Compiled情况下,通常会使启动速度慢许多,据说最多是60倍。

  说到C#的Regex,谈到最多的应该就是RegexOptions.Compiled这个东西,传说中在匹配速度方面,RegexOptions.Compiled是可以提升匹配速度的,但在启动速度上,使用了RegexOptions.Compiled情况下,通常会使启动速度慢许多,据说最多是60倍。

  进行一组测试,有测试数据,才有讨论依据。

  第一步,帖上测试硬件信息(呵呵,硬件有点烂:()

  第二步,

  a.测试在没有使用RegexOptions.Compiled项时候的情况,随意使用一些内容,然后循环一万次实例化正则表达式对象来匹配这些内容。

代码

)
{
Regex rgx =new Regex("<div>.+?</div>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
bool b1 = rgx.IsMatch(content);

Regex rgx2 =new Regex("<p>.+?</p>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
bool b2 = rgx2.IsMatch(content);

i--;
}
Response.Write(string.Concat("<div>", watcher.Elapsed.TotalSeconds.ToString("f7"), "</div>"));
}

  执行发现,内存使用情况为39,760K。输出的执行时间为3.7954446秒(刷了几次,取最快的那次)

  b.测试在使用了RegexOptions.Compiled项时候的情况,随意使用一些内容,然后循环一万次实例化正则表达式对象来匹配这些内容。

代码

)
{
Regex rgx =new Regex("<div>.+?</div>", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Compiled);
bool b1 = rgx.IsMatch(content);

Regex rgx2 =new Regex("<p>.+?</p>", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Compiled);
bool b2 = rgx2.IsMatch(content);

i--;
}
Response.Write(string.Concat("<div>", watcher.Elapsed.TotalSeconds.ToString("f7"), "</div>"));
}

  执行发现,内存使用情况为42,956K。输出的执行时间为43.3090937秒(刷了几次,取最快的那次)

  从a和b的测试中发现,不妥当地使用此选项,效率是极其低下的,尤其如果在WEB程序上,如果这个页面有大流量请求的话,那会有点不堪设想。我们在正常使用中,极大量文本处理的情况似乎比较少出现,基本上不能体现出RegexOptions.Compiled的所在匹配速度优势,所以通常建议不使用此项。(当然,在正常情况下,我们也不会在每个循环中都new一个正则表达式对象,我们可能会选择static一个)

  第三步,使用传说中的Regex.CompileToAssembly来编译正则表达式,再进行测试。这个,得自己写个编译小程序,帖上本人自己写的一个。点击下载

  与第二步相同的正则表达式Pattern,用这个工具生成dll后,引用到项目。测试执行,发现执行的内存使用情况与第二步的a差不多,速度也相差不多。当然,在这里,这种测试方案,可能看不出这种预编译的正则表达式的效率优点,事实上,它应该能够有更高的执行效率与匹配速度,最好使用多线程与多请求来进行测试。

  在此将其封装到DLL中,这将使最终的程序占用的内存更少,而不必装载使用RegexOptions.Compiled编译正则表达式的包,装载的速度也就得到了提升,同时也拥有了RegexOptions.Compiled的匹配速度优势。另外,也提高了需要一直复用的正则表达式的复用率。缺点,就是比较麻烦,而且只有固定的正则表达式能够这样使用。(关于如何使用Regex.CompileToAssembly,似乎也没多少能够解说的,就三两行代码,下载便知)

  似乎并无深入谈到原理,不过,也并不重要,我们只要经过测试,知道怎么使用能够更好就行了。在此,个人的建议是,通常都不要使用RegexOptions.Compiled,即使要在代码中使用,也应该使用static变量。

  如果真有那么大文本要用的时候,我相信,这个正则表达式也不可能是动态的,固定的正则,我们就使用Regex.CompileToAssembly来先编译成DLL再引用到项目中,即能提供效率,也提高了复用率。

浅谈提升C#正则表达式效率的更多相关文章

  1. 浅谈WebService返回数据效率对比

    原文链接 http://www.dotnetgeek.cn/xuexiwebservice1.html 一.什么是WebService: 简单通俗来说,就是企业之间.网站之间通过Internet来访问 ...

  2. 浅谈 js 正则字面量 与 new RegExp 执行效率

    原文:浅谈 js 正则字面量 与 new RegExp 执行效率 前几天谈了正则匹配 js 字符串的问题:<js 正则学习小记之匹配字符串> 和 <js 正则学习小记之匹配字符串优化 ...

  3. 浅谈自底向上的Shell脚本编程及效率优化

    作者:沐星晨 出处:http://blog.csdn.net/sosodream/article/details/6276758 浅谈自底向上的Shell脚本编程及效率优化 小论文,大家多批评指导:) ...

  4. 浅谈Java正则表达式

    正则表达式我们都知道,它定义了字符串的模式,可以用来搜索.编辑或处理文本.我们在某些特定场景中用起来是非常方便的.它等于是给我们划定了一个范围,让我们可以精准的匹配到我们想要的结果.比如我想判断一个几 ...

  5. 浅谈JavaScript中的正则表达式(适用初学者观看)

    浅谈JavaScript中的正则表达式 1.什么是正则表达式(RegExp)? 官方定义: 正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去 ...

  6. 浅谈PageHelper插件分页实现原理及大数据量下SQL查询效率问题解决

    前因:项目一直使用的是PageHelper实现分页功能,项目前期数据量较少一直没有什么问题.随着业务扩增,数据库扩增PageHelper出现了明显的性能问题.几十万甚至上百万的单表数据查询性能缓慢,需 ...

  7. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  8. MYSQL优化浅谈,工具及优化点介绍,mysqldumpslow,pt-query-digest,explain等

    MYSQL优化浅谈 msyql是开发常用的关系型数据库,快速.稳定.开源等优点就不说了. 个人认为,项目上线,标志着一个项目真正的开始.从运维,到反馈,到再分析,再版本迭代,再优化… 这是一个漫长且考 ...

  9. 浅谈Hybrid技术的设计与实现第三弹——落地篇

    前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...

随机推荐

  1. faker php测试数据库生成2

    因内容太长,被csdn截断了,只好把另外的内容写到这里. //Biased // 在10到20之间得到一个随机数字,有更大的几率接近20 echo $faker->biasedNumberBet ...

  2. Wannafly 22A

    题解 另g = gcd(a1,a2,a3....) 那么k * g % m的方案书就是答案 这个式子子显然是有循环节的 x * g = 0 mod m ,x * g + y * m = 0 exgcd ...

  3. BZOJ2612 : [Poi2003]Sums

    设d[i]表示能拼出的x中满足x%a[0]=i的最小的x,其中d[0]=0. 若d[x%a[0]]<=x,则一定可以拼出x,否则一定不可以. 建出带权有向图,点的标号从0到a[0]-1,i号点向 ...

  4. nodejs备忘总结(一) -- 基础入门

    什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一 ...

  5. mysql导入csv文件

    今天尝试将Oracle中的数据导入到mysql中,在SQLyog工具其中看到一些sql语句,拿来记录一下,说不定以后就用的着呐! -----查看ydtf数据库中的基础表,就是用户创建了哪些表 SHOW ...

  6. RX库中的IDisposable对象

    IDisposable是.net中的主动资源释放接口,它是在编程过程中经常使用到的一个接口,本文介绍一下微软在Rx.NET中提供的一系列常用的Disposable类,通过它们可以简化我们的程序代码,提 ...

  7. 《Go语言实战》摘录:6.1 并发 - 并行 与 并发

    6.1 并行 与 并发

  8. [置顶] android socket 聊天实现与调试

    网上很多基于Socket的聊天实现都是不完整的... 结合自己的经验给大家分享一下,完整代码可以在GitHub里获取https://github.com/zz7zz7zz/android-socket ...

  9. Virtualenv教程

    虚拟环境简介 VirtualEnv用于在一台机器上创建多个独立的Python虚拟运行环境,多个Python环境相互独立,互不影响,它能够: 在没有权限的情况下安装新套件 不同应用可以使用不同的套件版本 ...

  10. .Net Discovery 系列之二--string从入门到精通(下)

    前两节我们介绍了string的两个基本特性,如果你觉得你已经比较全面的了解了string,那么就来看看这第3.4两节吧. 三.有趣的比较操作  在第一节与第二节中,我们分别介绍了字符串的恒定性与与驻留 ...