繁体   English   中英

StringBuilder ToString与String Substring的C#性能

[英]C# performance of StringBuilder ToString vs String Substring

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

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

为什么我需要它:

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

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

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

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

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

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

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

你不需要这样做。 .NET正则表达式引擎包含一项功能,使您可以使用\\G锚点匹配紧跟上一个匹配项后的字符串。

示例正则表达式:

\Gcat

示例字符串:

catcatcatdogcat

火柴:

(cat)(cat)(cat)dogcat

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

许多字符串操作方法都有开始/结束或开始/长度对的版本。

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

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

注:与任何性能问题,你需要尝试变化和衡量自己的数据

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM