当您将正则表达式标记为要编译的正则表达式时,幕后发生了什么?这与缓存的正则表达式相比/有什么不同?
使用这些信息,您如何确定与性能提升相比,何时计算成本可以忽略不计?
发布于 2009-02-04 21:31:00
BCL团队博客中的这篇文章给出了一个很好的概述:"Regular Expression performance“。
简而言之,有三种类型的正则表达式(每种类型的执行速度都比前一种快):
在飞行中创建快,慢到execute
动态创建速度较慢,执行速度较快(适合在loops)
在您的应用程序编译时创建(无运行时创建损失),快速执行
因此,如果您打算只执行一次正则表达式,或者在应用程序的非性能关键部分(即用户输入验证)中执行正则表达式,则可以使用选项1。
如果您打算在循环中运行正则表达式(即逐行解析文件),则应该使用选项2。
如果你有很多的正则表达式,这些正则表达式在你的应用程序中永远不会改变,并且被频繁使用,那么你可以选择选项3。
发布于 2009-02-04 21:37:53
应该注意的是,从MRU2.0开始,使用未编译正则表达式的.NET缓存改进了正则表达式的性能。Regex库代码不再每次都重新解释相同的未编译正则表达式。
因此,使用已编译的动态正则表达式可能会带来更大的性能损失。除了加载时间较慢外,系统还使用更多内存将正则表达式编译为操作码。
从本质上讲,当前的建议是要么不编译正则表达式,要么提前将它们编译到单独的程序集中。
参考: BCL团队博客Regular Expression performance [David Gutierrez]
发布于 2009-02-04 21:34:08
1) Base Class Library Team on compiled regex
2) Coding Horror, referencing #1 with some good points on the tradeoffs
https://stackoverflow.com/questions/513412
复制相似问题