曾经一位同事在写程序时发现在利用正则表达式匹配文本时的效率很低。首先可以排除是正则表达式本身的问题,因为所使用的正则表达式是十分简单的,匹配的文本量也不算大。检查的时候去掉了RegexOptions.Compiled的选项之后,程序整体速度得到了很大的提升。

  这是因为误解了RegexOptions.Compiled这个选项提供的功能。在正则引擎启动正则表达式之前,需要做一些准备工作,这些准备工作包括检查正则表达式是否符合格式规范,并将其转化能够实际应用的内部形式。在许多关于正则表达式的文档中,将这一过程用compile来描述。然而在.NET中,这个过程实际上是以parsing来描述的。

  在.NET中,parsing是指在程序执行过程中,第一次遇到正则表达式时必须检查它是否格式规范,并将其转换为适于.NET正则引擎实际应用的内部形式。

  当指定RegexOptions.Compiled的时候,所提供的机制是告诉正则引擎,除了将正则表达式转换为认定的内部形式外,还将其编译(很多人会混淆这里的编译和parsing的过程)为底层的MSIL(Microsoft Intermediate Language)代码,在正则表达式实际应用时,可以由JIT(Just-In-Time)优化为更快的本地机器代码。上海网站建设p上海徐汇企业网站制作'color:white;' href='http://www.93tj.com'>上海企业网站制作>

  启动这个选项究竟对性能产生了怎样的影响,可以从三个方面来看。

  首先在启动速度上,在不使用RegexOptions.Compiled会比较快,使用了RegexOptions.Compiled情况下,通常会使启动速度慢许多,据说最多是60倍。

  在内存占用方面,使用RegexOptions.Compiled时,通常每个表达式会占用5KB~15KB的内存,更重要的是,在程序执行过程中,这块内存是无法被释放的。这里有时会带来一些问题,因为Regex在.NET中作为对象被封装,如果是多个进程或请求同时调用到这个代码片段,可能会造成相同的正则表达式在重复占用了内存,这取决于程序具体的实现方式。

  在匹配速度方面,RegexOptions.Compiled是可以提升匹配速度的,但是因为有在启动速度和内存占用方面带来的额外开销,所以除非是在需要匹配大量的文本和反复使用某正则表达式时,这种提升非常不明显,而且在许上海闵行企业网站设计与制作多人误用此选项的情况下,得到的结果反而是程序整体运行速度的下降。所以在非大量文本处理的情况下,如果对程序整体效率有严格要求,建议不要使用该选项。

  如果需要使用该选项,那么一个应该考虑的也是更好的方案应该是将要使用的正则对象封装到一个DLL中,这将上海徐汇企业网站设计与制作使最终的程序占用的内存更少,因为不必装载使上海闵行企业网站制作='http://www.93tj.com'>上海企业网站设计与制作用RegexOptions.Compiled编译正则表达式的包。另外,由于在封装DLL时正则表达式已经编译好了,装载的速度也就得到了提升。附带的一个好处就是这个包还可以提供给其他需要的程序员调用,而不是copy正则表达式的代码。

  以上内容和分析适用于.NET Framework 2.0。

转载于:https://www.cnblogs.com/waw/archive/2011/10/15/2213543.html

Reg“.NET研究”exOptions.Compiled的含义和使用相关推荐

  1. java regexoptions.compiled_RegexOptions.Compiled的含义和使用

    曾经一位同事在写程序时发现在利用正则表达式匹配文本时的效率很低.首先可以排除是正则表达式本身的问题,因为所使用的正则表达式是十分简单的,匹配的文本量也不算大.检查的时候去掉了RegexOptions. ...

  2. 北京企业科技研究开发机构认定,奖励100万

    科技研究开发机构认定项目围绕企业发展方向.企业信用.知识产权.成长性.研发等多个维度对企业进行综合评定,取得资质认定后的企业可以获得政府方面的一些支持.比如:税收政策.政府资金和项目资助.人才引进等. ...

  3. C语言程序设计(常用函数说明)

    C语言程序设计(常用函数说明) C 语言是1972年由美国的Dennis Ritchie设计发明的,并首次在UNIX操作系统的 DEC PDP-11计算机上使用.它由早期的编程语言 BCPL(Basi ...

  4. 自然语言生成技术现状调查:核心任务、应用和评估(4)

    前面的自然语言生成技术现状调查:核心任务.应用和评估(1)_流萤数点的博客-CSDN博客 自然语言生成技术现状调查:核心任务.应用和评估(2)_流萤数点的博客-CSDN博客 自然语言生成技术现状调查: ...

  5. 第六章 深度学习(上中)

    其他的深度学习模型 在整本书中,我们聚焦在解决 MNIST 数字分类问题上.这一"下金蛋的"问题让我们深入理解了一些强大的想法:随机梯度下降,BP,卷积网络,正规化等等.但是该问题 ...

  6. python3.7.4+Django2.2.6一直提示path404报错问题:“Using the URLconf defined in XXX.urls, Django tried this...”

    [写在前面]: 最近在做python+Django做路径开发时一直被路由设置中的path路径设置所困扰,抽空把自己遇到的一些坑的解决方案一起和大家分享一下,欢迎大家评论区交流: [Django应用工作 ...

  7. Django(一):项目中urls.py文件中path()函数的说明及应用

    函数 path() 具有四个参数,两个必须参数:route 和 view,两个可选参数:kwargs 和 name.现在,是时候来研究这些参数的含义了. path() 参数:route¶ route ...

  8. 1970 matla 时间_关于matlab:UTC到字符串的转换时间

    我正在寻找帮助使用MATLAB将时间从UTC时间转换为字符串的时间. 我正在尝试从2010年10月底收集的数据文件中提取时间. 数据文件说它以UTC时间报告,该字段是一个整数字符串值(以毫秒为单位), ...

  9. 编写你的第一个 Django 应用,第 1 部分

    Hello,我是 Alex 007,一个热爱计算机编程和硬件设计的小白,为啥是007呢?因为叫 Alex 的人太多了,再加上每天007的生活,Alex 007就诞生了. 编写你的第一个 Django ...

最新文章

  1. MongoDB Array Query Operators
  2. python3下载-python3
  3. 关于Shiro的标签应用
  4. dev c++调试怎么看变量的值_DevC++ 安装教程
  5. nginx代理安装ssl证书
  6. 【Oracle】存储过程 遍历树 举例emp表的树状结构
  7. ruby--数值类(Numeric)
  8. win10 使用多桌面的两种方式
  9. 国外的云服务器网站推荐哪一家(在国内可以直接上的那种)?
  10. 开源巨献:Google最热门的40款开源项目
  11. 汉字简体繁体转换----Javascript
  12. 计算机文档库怎么进,Windows电脑注册表怎么进?
  13. 安装vag服务器虚拟机,FusionAccess桌面云组件介绍/安装
  14. 鸿蒙系统可以几年不卡顿,鸿蒙系统会不会越用越卡?鸿蒙系统会影响王者荣耀吗?...
  15. 网络营销推广是什么_什么样的网站适合做SEO?
  16. Android详细教程(基础篇):二十八、Android 广播机制BroadcastReceiver
  17. 常用选股公式编写样例
  18. 矩阵理论奇异值分解例题
  19. 基于python的奥运会历史数据分析【120年】
  20. 利润表模板excel_EXCEL要吗?利润表模板

热门文章

  1. [ActionScript 3.0] AS3中的位图(BitmapData)应用
  2. [Effective C++ --032]确定你的public继承塑模出is-a
  3. 最适合新手的手动搭建wamp环境教程
  4. floyd求最小环 模板
  5. ExtJS监听键盘事件:回车键实现登录功能
  6. HeadFirst之设计模式 觀察者模式
  7. JAVA 向文本文件中换行插入字符
  8. 寻找先序遍历中第k个节点
  9. Scala的partition函数
  10. ubuntun opencv 编译成64_19、OpenCV图像平滑处理