C# 为什么静态正则表达式比实例正则表达式慢?

C# 为什么静态正则表达式比实例正则表达式慢?,c#,regex,performance,static,C#,Regex,Performance,Static,当我读到以下内容时,我正在读一篇关于正则表达式的文章 …我们发现使用Regex实例对象比使用静态Regex.Match更快。为了提高性能,您应该始终使用实例对象。 我本以为使用static方法会更快,因为我怀疑它们的regex.match相同,但实例需要初始化(当然这需要时间) 经过一番探索,我至少发现(部分)我的直觉是正确的。关于静态方法,dotnerperls的文章指出:(重点是我的) 静态方法没有实例。它们是用类型名而不是实例标识符调用的。正因为如此,它们的速度略快于实例方法 但是为什么正

当我读到以下内容时,我正在读一篇关于正则表达式的文章

…我们发现使用Regex实例对象比使用静态Regex.Match更快。为了提高性能,您应该始终使用实例对象。

我本以为使用
static
方法会更快,因为我怀疑它们的regex.match相同,但实例需要初始化(当然这需要时间)

经过一番探索,我至少发现(部分)我的直觉是正确的。关于静态方法,dotnerperls的文章指出:(重点是我的)

静态方法没有实例。它们是用类型名而不是实例标识符调用的。正因为如此,它们的速度略快于实例方法


但是为什么正则表达式实例比静态类快呢?

要执行静态正则表达式匹配,正则表达式对象需要将模式转换为可以执行的结构(通过创建内部正则表达式实例),并且需要搜索传递到匹配中的字符串,除此之外,还缓存了内部Regex实例,以便在后续调用中更快地执行。因此,第一次执行静态匹配所用的时间大约为:

  • 检查可重用实例的正则表达式缓存(找不到)
  • 创建内部正则表达式实例
  • 缓存正则表达式实例
  • 执行匹配
随后的呼叫或多或少是:

  • 检查可重用实例的正则表达式缓存(将找到一个)
  • 使用缓存的实例执行匹配
使用实例对象创建实例并在该实例上调用匹配-无需花费时间查看或管理内部缓存,对该实例的每个后续调用只执行匹配逻辑。因此,在这种情况下,实例匹配总是比静态匹配快


一般来说,调用一个静态方法会比调用一个等价的实例方法快(稍微快),但前提是这些方法做的事情完全相同,这是不可能的,因为静态方法不能有实例状态…

看看这个答案@Pengu,谢谢这个答案也回答了我的问题。关于投我一票的人。我想指出的是,这些问题并不相同。链接的问题询问您是否应该使用
static
instance
,我的问题是为什么
static
更快。事实上,被接受的答案也回答了我的问题是幸运的,但这并不意味着这个问题是重复的。很好的快速参考答案,特别是指出关于静态性能的信息主要是理论上的。我还想建议有这个问题的人阅读链接中的公认答案,以获得关于正则表达式缓存的更详细解释。