为什么静态RegEx比实例RegEx慢?

时间:2013-11-29 07:37:23

标签: c# regex performance static

当我阅读以下内容时,我正在阅读this关于regular expressions dotnetperls.com 文章:(强调我的) < / p>

  

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

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

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

  

静态方法没有实例。它们使用类型名称调用,而不是实例标识符。由于这个原因,比实例方法略快。

但是为什么RegEx实例会比静态类更快?

1 个答案:

答案 0 :(得分:2)

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

  • 检查可重用实例的Regex缓存(找不到)
  • 创建内部正则表达式实例
  • 缓存Regex实例
  • 执行比赛

后续调用或多或少:

  • 检查Regex缓存以获取可重用的实例(将找到一个)
  • 使用缓存实例执行匹配

使用实例对象,您可以在该实例上创建实例并调用匹配 - 没有时间查看或管理内部缓存,实例上的每个后续调用仅执行匹配逻辑。因此,在这种情况下,实例匹配总是比静态匹配更快。

一般来说,调用静态方法(稍微)会比调用等效的实例方法更快,但只有当方法执行完全相同的操作时才会这样做,这是不可能的,因为静态方法不能有实例状态......