StringBuilder ToString与String Substring的C#性能

时间:2012-07-25 17:59:57

标签: c# .net regex string performance

使用String然后为此String调用Substring的速度更快,其中第一个Substring将是初始String,并且每个新的Substring从初始子字符串中的较小部分直到结束?或者使用StringBuilder从一开始就切断越来越多,然后总是从收缩的字符串中使用ToString?

这个link描述了StringBuilder ToString方法只在新线程访问StringBuilder或者返回的String远小于当前分配的空间时才分配新空间。这听起来比使用Substring更快。我可以在implementation到.Net Framework 3.5中看到这个逻辑。对于版本4.0,立即调用FastAllocateString(或多或少与String Substring一样)。它是否与以前的框架版本中的逻辑相同,现在只隐藏?

为什么我需要它:

修改:更新说明: 我有一个字符串和一组用户给定的正则表达式和一个上下文。上下文告诉我哪些正则表达式尝试与字符串的开头匹配将是有趣的。成功匹配后,字符串的开头现在在最后一场比赛结束之后。现在可能存在不同的背景。另外我想知道哪个正则表达式最后一次匹配。 由于这是多次完成,性能应该尽可能好。

为了避免搜索整个(剩余的)字符串,我会使用start-anchor(^),因此可以尽快(在知道开始不匹配之后)进行搜索。如果我这样做,我遇到的问题是我不能使用Match方法的start index参数和0以外的任何东西。否则,由于锚点,永远不会有匹配。

所以我认为我现在有两种可能性:

1)始终在输入字符串上使用Substring方法并保留当前位置并为其编制索引。

2)使用StringBuilder并在成功匹配时始终删除输入的开头。然后调用ToString方法以查看新的开始是否与下一个正则表达式匹配。

上述一种或两种方法的表现是否可以接受,还是有另一种更快的方式?

Edit2:关于StringBuilder和String:正如所描述的here,StringBuilder的实现现在立即分配空间,而之前这个被延迟,直到StringBuilder字符串被更改(这可能是案件所有时间都符合我的要求)。所以我认为与Kendall Frey的Regex-only解决方案相比,Substring和ToString都非常慢。

2 个答案:

答案 0 :(得分:3)

您不需要这样做。 .NET正则表达式引擎包含一项功能,可让您使用\G anchor在紧接上一次匹配后匹配字符串。

示例正则表达式:

\Gcat

示例字符串:

catcatcatdogcat

匹配

(cat)(cat)(cat)dogcat

编辑:我认为正则表达式不会让你记住多个正则表达式之间的\G锚位置。相反,您可以使用Regex.Match(string, int)重载来在某个点开始您的字符串,并使用\G锚点来匹配起始位置。

答案 1 :(得分:0)

许多字符串操作方法都有包含begin / end或begin / length对的版本。

即。 Regex.Match可用于匹配子串,这可能比部分切割字符串或插入标记字符更快。

public Match Match(string input, int beginning, int length)

注意:与任何性能问题一样,您需要尝试变体并自行测量您的数据。