1

请让我知道哪个在性能 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]", "")
4

2 回答 2

1

以下是如何找出答案:

  1. 从http://www.linqpad.net/下载 LINQPad
  2. 编写 2 个替换的函数
  3. 使用Stopwatch超过 10000 次迭代检查它们的性能
于 2013-01-04T16:39:57.887 回答
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,这不会给出不同的结果吗?

于 2013-01-04T17:06:59.740 回答