C# 为什么静态正则表达式比实例正则表达式慢?
当我读到以下内容时,我正在读一篇关于正则表达式的文章 …我们发现使用Regex实例对象比使用静态Regex.Match更快。为了提高性能,您应该始终使用实例对象。 我本以为使用C# 为什么静态正则表达式比实例正则表达式慢?,c#,regex,performance,static,C#,Regex,Performance,Static,当我读到以下内容时,我正在读一篇关于正则表达式的文章 …我们发现使用Regex实例对象比使用静态Regex.Match更快。为了提高性能,您应该始终使用实例对象。 我本以为使用static方法会更快,因为我怀疑它们的regex.match相同,但实例需要初始化(当然这需要时间) 经过一番探索,我至少发现(部分)我的直觉是正确的。关于静态方法,dotnerperls的文章指出:(重点是我的) 静态方法没有实例。它们是用类型名而不是实例标识符调用的。正因为如此,它们的速度略快于实例方法 但是为什么正
static
方法会更快,因为我怀疑它们的regex.match相同,但实例需要初始化(当然这需要时间)
经过一番探索,我至少发现(部分)我的直觉是正确的。关于静态方法,dotnerperls的文章指出:(重点是我的)
静态方法没有实例。它们是用类型名而不是实例标识符调用的。正因为如此,它们的速度略快于实例方法
但是为什么正则表达式实例比静态类快呢?要执行静态正则表达式匹配,正则表达式对象需要将模式转换为可以执行的结构(通过创建内部正则表达式实例),并且需要搜索传递到匹配中的字符串,除此之外,还缓存了内部Regex实例,以便在后续调用中更快地执行。因此,第一次执行静态匹配所用的时间大约为:
- 检查可重用实例的正则表达式缓存(找不到)
- 创建内部正则表达式实例
- 缓存正则表达式实例
- 执行匹配
- 检查可重用实例的正则表达式缓存(将找到一个)
- 使用缓存的实例执行匹配
一般来说,调用一个静态方法会比调用一个等价的实例方法快(稍微快),但前提是这些方法做的事情完全相同,这是不可能的,因为静态方法不能有实例状态…看看这个答案@Pengu,谢谢这个答案也回答了我的问题。关于投我一票的人。我想指出的是,这些问题并不相同。链接的问题询问您是否应该使用
static
或instance
,我的问题是为什么static
更快。事实上,被接受的答案也回答了我的问题是幸运的,但这并不意味着这个问题是重复的。很好的快速参考答案,特别是指出关于静态性能的信息主要是理论上的。我还想建议有这个问题的人阅读链接中的公认答案,以获得关于正则表达式缓存的更详细解释。