【问题标题】:Which is better to remove alpha characters from string for long strings - RegEx vs IsLetter哪个更好地从字符串中删除长字符串的字母字符 - RegEx vs IsLetter
【发布时间】:2013-01-04 16:35:27
【问题描述】:

请告诉我哪个在 RegEx 或带 IsLetter 的循环方面的性能更好。

这两种方法我都试过了,发现 RegEx 比 For Loop 花费的时间多一点...

Dim vStr1 As String, vStr2 As New StringBuilder

vStr1 = "Testadfasdfadsfasdfadsfas12312dfadsfdsa23131fadsfsadfsadf1sss 23 -1234"    

Method 1
-------------------
vStr2.Clear()
For Each vChr In vStr1
    If Char.IsLetter(vChr) = False Then vStr2.Append(vChr)
Next
vStr1 = vStr2.ToString
-------------------------

Method 2
-------------------
vStr1 = Regex.Replace(vStr1, "[A-Za-z^s]", "")

【问题讨论】:

  • 什么更好?表现?代码行数少?还有什么?
  • 在性能方面使用大字符串编辑数据表中的大量行...
  • 数据表?这有在错误的地方解决问题的味道。如果您正在从数据库中读取内容并在之后将其持久化,我的猜测是您正在寻找优化错误的代码

标签: .net regex vb.net loops


【解决方案1】:

循环方法会更快。无需为一个人编译正则表达式,而且在这些简单的情况下,RegEx 几乎总是松散的。

在方法1中,如果将vStr2的容量设置为vStr1的长度,将避免内存分配缓慢。

Dim vStr1 As String
vStr1 = "Testadfasdfadsfasdfadsfas12312dfadsfdsa23131fadsfsadfsadf1sss 23 -1234"
Dim vStr2 As New StringBuilder(vStr1.Length)

此外,如果您多次执行此操作,请使用 vStr2.Clear() 而不是丢弃 StringBuilder 并分配一个新的。

在方法 2 中 您可以通过编译 RegEx 来改进。我也不确定你为什么在字符列表中有 ^s,这不会给出不同的结果吗?

【讨论】:

  • 感谢 Martin Brown,我已经对大型数据表的不同列进行了 10-15 次性能测试,并且总是发现字符串函数比 RegEx 更快...看来我必须使用字符串函数来存档我的以更好的方式实现目标。请给我你的建议。再次感谢。
【解决方案2】:

这里是如何找出来的:

  1. http://www.linqpad.net/下载LINQPad
  2. 编写 2 个替换函数
  3. 使用Stopwatch 超过 10000 次迭代检查它们的性能

【讨论】:

  • 我用秒表尝试过,发现 RegEx 比 for 循环花费更多时间...我已经发布了这个问题,以便在使用任何方法之前获得专家建议。
  • 专家建议考虑对这两种方法进行大 O 成本分析。如果做不到这一点,请在此处使用务实的方法,并将 linqpad 替换为您的执行引擎,并将 10000 替换为每小时自己的情况
猜你喜欢
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多