c# - 为什么静态 RegEx 比实例 RegEx 慢?

标签 c# regex performance static

我正在阅读 this 关于 dotnetperls.com 的文章关于正则表达式,当我阅读以下内容时:(强调我的)

...we see that using a Regex instance object is faster than using the static Regex.Match. For performance, you should always use an instance object.

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

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

Static methods have no instances. They are called with the type name, not an instance identifier. They are slightly faster than instance methods because of this.

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

最佳答案

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

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

后续调用或多或少:

  • 检查 Regex 缓存中的可重用实例(会找到一个)
  • 使用缓存实例执行匹配

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

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

关于c# - 为什么静态 RegEx 比实例 RegEx 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20280597/

相关文章:

javascript - 未初始化的变量内存分配

c# - 如何使用 DotNumerics 解决线性规划问题?

c# - 用于匹配字符串开头的正则表达式

java - 可以存储在 HashMap 中的键(对象)数量的理论限制?

c++ - 对大量数据组织逐个比较操作的最佳方式是什么?

c# - 如何找到WMP网址的文件名和文件路径?

c# - 无法使用 1 : 1 mapping using EF Code First 将记录保存到数据库

java - 模式和匹配器在 Java 中不起作用

javascript - 正则表达式检测不带 http 或 www 的 URL

不同窗口大小的滚动总和