当前位置: 首页 > news >正文

Reg“.NET研究”exOptions.Compiled的含义和使用

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

相关文章:

  • Silver“.NET研究”light 游戏开发小技巧:升级和传送点特效1
  • MPLS 原理
  • Web.config 加密与解密
  • Axis2附件传输
  • MeeGo开发“.NET研究”进程通信核心 DBus调试工具
  • 偶有所感
  • MPLS 原理详解
  • [翻译]WP7 QuickStart-第八篇-屏幕方向
  • WISEGATE:SIEM的最佳实践讨论
  • 庆祝自己的BLOG之旅开启
  • Silverlight 苹果风格按钮Mac OS Style 实现的更新版
  • C# CHECKEDLISTBOX控件用法总结(怎样得到多选的值)
  • CDP
  • 浅谈电池和充电方面的知识
  • Android 开发 数据结构理解 队列和栈 分析及实现
  • 【comparator, comparable】小总结
  • ERLANG 网工修炼笔记 ---- UDP
  • gf框架之分页模块(五) - 自定义分页
  • git 常用命令
  • JavaScript异步流程控制的前世今生
  • js学习笔记
  • Leetcode 27 Remove Element
  • node入门
  • python 学习笔记 - Queue Pipes,进程间通讯
  • python_bomb----数据类型总结
  • React+TypeScript入门
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Vue2.0 实现互斥
  • 基于组件的设计工作流与界面抽象
  • 什么软件可以剪辑音乐?
  • 温故知新之javascript面向对象
  • 我与Jetbrains的这些年
  • NLPIR智能语义技术让大数据挖掘更简单
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​第20课 在Android Native开发中加入新的C++类
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (52)只出现一次的数字III
  • (C语言)逆序输出字符串
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (四) Graphivz 颜色选择
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一) storm的集群安装与配置
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • @angular/cli项目构建--Dynamic.Form
  • @Autowired注解的实现原理
  • @PreAuthorize注解
  • [.net]官方水晶报表的使用以演示下载
  • [04] Android逐帧动画(一)
  • [20160902]rm -rf的惨案.txt
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [Android Pro] AndroidX重构和映射
  • [Big Data - Kafka] kafka学习笔记:知识点整理