相关疑难解决方法(0)

String.Replace .NET Framework的内存效率和性能

 string str1 = "12345ABC...\\...ABC100000"; 
 // Hypothetically huge string of 100000 + Unicode Chars
 str1 = str1.Replace("1", string.Empty);
 str1 = str1.Replace("22", string.Empty);
 str1 = str1.Replace("656", string.Empty);
 str1 = str1.Replace("77ABC", string.Empty);

 // ...  this replace anti-pattern might happen with upto 50 consecutive lines of code.

 str1 = str1.Replace("ABCDEFGHIJD", string.Empty);
Run Code Online (Sandbox Code Playgroud)

我继承了一些与上面的代码片段相同的代码.它需要一个巨大的字符串,并从大字符串中替换(删除)常量较小的字符串.

我相信这是一个非常耗费内存的过程,因为每个替换都会在内存中分配新的大型不可变字符串,等待通过GC死亡.

1.更换这些值的最快方法是什么,忽略内存问题?

2.实现相同结果的最有效的内存方式是什么?

我希望这些是相同的答案!

在这些目标之间适合某些地方的实用解决方案也值得赞赏.

假设:

  • 所有替换都是不变的并且事先已知
  • 底层字符确实包含一些unicode [non-ascii]字符

.net c# string

37
推荐指数
4
解决办法
4万
查看次数

StringBuilder.Replace()比String.Replace更有效吗?

如果必须使用String.Replace()替换测试50次,则基本上必须创建一个新字符串50次.StringBuilder.Replace()是否更有效地执行此操作?例如,如果我要替换大量文本,我是否应该使用StringBuilder,即使我不会向其添加任何数据?

我正在使用.NET,但我认为这与Java和其他语言可能相同.

.net string stringbuilder

28
推荐指数
3
解决办法
1万
查看次数

在什么时候使用StringBuilder变得无关紧要或开销?

最近我发现自己使用StringBuilder进行所有字符串连接,无论大小,但是在最近的性能测试中,我换掉了同事的stringOut = string1 +"." String2样式连接(在一个10000x +循环中使用,每次都是StringBuilder)用于StringBuilder只是为了看看它在次要连接中会有什么不同.

我发现,在性能测试的许多次运行中,无论是串联还是StringBuilder,更改都无论是更高还是更低(重申这是针对小型连接).

在什么时候,StringBuilder对象的"newing up"否定了使用它的好处?

.net stringbuilder

18
推荐指数
3
解决办法
2710
查看次数

是否有人围绕StringBuilders或Streams实现了正则表达式和/或Xml解析器?

我正在构建一个压力测试客户端,它使用尽可能多的线程来锤击服务器并分析响应,因为客户端可以集合.我经常发现自己受到垃圾收集(和/或缺乏收集)的限制,并且在大多数情况下,它归结为我实例化的字符串,只是将它们传递给Regex或Xml解析例程.

如果您对Regex类进行反编译,您将在内部看到它使用StringBuilders来执行几乎所有操作,但是您不能传递给字符串构建器; 在开始使用私有方法之前,它有助于深入研究私有方法,因此扩展方法也不会解决它.如果您想从System.Xml.Linq中的解析器中获取对象图,则处于类似情况.

这不是一个迂腐过度优化的案例.我查看了StringBuilder问题和其他问题中的正则表达式替换.我还介绍了我的应用程序,看看天花板的来源,Regex.Replace()现在使用确实在方法链中引入了大量开销,我试图以每小时数百万的请求命中服务器,并检查XML响应中的错误和嵌入式诊断代码.我已经摆脱了限制吞吐量的所有其他低效率,并且当我不需要捕获组或反向引用时,我甚至通过扩展StringBuilder来进行通配符查找/替换,从而减少了大量的Regex开销.但在我看来,现在有人会把自定义的StringBuilder(或更好的,基于Stream)的Regex和Xml解析实用程序包起来.

好吧,如此咆哮,但我自己必须这样做吗?

更新:我找到了一个解决方法,将峰值内存消耗从几千兆字节降低到几百兆,所以我将其发布在下面.我不是把它作为答案添加因为a)我一般不喜欢这样做,而且b)我仍然想知道是否有人花时间定制StringBuilder来做Regexes(反之亦然).

在我的情况下,我无法使用XmlReader,因为我正在摄取的流包含某些元素中的一些无效二进制内容.为了解析XML,我必须清空这些元素.我以前使用单个静态编译的Regex实例进行替换,这就像疯了一样消耗内存(我正在尝试处理~300个10KB docs/sec).大幅减少消费的变化是:

  1. 在CodeProject上的这篇StringBuilder Extensions文章中添加了代码,以获得方便的IndexOf方法.
  2. 我添加了一个(非常)粗略的WildcardReplace方法,每次调用允许一个通配符(*或?)
  3. 我用一个WildcardReplace()调用来替换正则表达式的用法,以清空有问题的元素的内容

这是非常不合适的,仅在我自己的目的要求下进行测试; 我会让它更优雅和强大,但YAGNI和所有这一切,我很匆忙.这是代码:

/// <summary>
/// Performs basic wildcard find and replace on a string builder, observing one of two 
/// wildcard characters: * matches any number of characters, or ? matches a single character.
/// Operates on only one wildcard per invocation; 2 …
Run Code Online (Sandbox Code Playgroud)

c# regex stringbuilder

10
推荐指数
1
解决办法
1024
查看次数

在StringBuilder上使用正则表达式替换的最佳方法是什么?

可能重复:
StringBuilder中的正则表达式替换

在StringBuilder上多次进行正则表达式替换的最佳方法是什么?

如果您不介意不是一个tl;dr人,请进一步阅读以获取详细信息:

嗨,我有一个函数,对字符串进行了很多字符串操作.很自然地,我正在使用StringBuilder类.现在我陷入了两难境地.

我的功能是这样的:

 ParsedText.Append("some footers here");
 ParsedText.Replace("[b]","<b>"); //format all bold opens
 ParsedText.Replace("[/b]","</b>"); //format all bold closes
 ParsedText.Replace("\n","<br />"); //format newlines

 .... sh!* load of other replaces and manipulations ...

 //Add <a href> to all links
 ParsedText = new StringBuilder(Regex.Replace(ParsedText, "pattern", "replacement"))
Run Code Online (Sandbox Code Playgroud)

现在,我有一个自定义的单词(模式)列表,我想要替换 - 大约20个模式..

我试图用他们各自的图像替换所有的笑脸符号; 像这样:

:) becomes <img src="smile.png" />
;) becomes <img src="wink.png" />
Run Code Online (Sandbox Code Playgroud)

等等...我有大约20个图像/符号要替换,我正在使用这个正则表达式

(?<=^|\s):d(?=$|\s) //positive lookahead and lookback at :d
Run Code Online (Sandbox Code Playgroud)

其中鲍勃谷友好提供.

所有这一切都很棒,除了,我不知道如何用StringBuilder替换正则表达式,我不想像这样创建一个新的StringBuilder:

 ParsedText = new StringBuilder(Regex.Replace(...));
Run Code Online (Sandbox Code Playgroud)

我认为它击败了整个记忆保护目的二十次.

那么,在StringBuilder上进行正则表达式替换的最佳方法是什么?

谢谢!

c# regex stringbuilder

6
推荐指数
1
解决办法
6076
查看次数

如何使用 StringBuilder 进行多个不区分大小写的替换

我有一个(大)模板,想要替换多个值。替换需要不区分大小写。还必须能够拥有模板中不存在的键。

例如:

[TestMethod]
public void ReplaceMultipleWithIgnoreCaseText()
{
    const string template = "My name is @Name@ and I like to read about @SUBJECT@ on @website@, tag  @subject@";  
    const string expected = "My name is Alex and I like to read about C# on stackoverflow.com, tag C#";
    var replaceParameters = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("@name@","Alex"),
        new KeyValuePair<string, string>("@subject@","C#"),
        new KeyValuePair<string, string>("@website@","stackoverflow.com"),
        // Note: The next key does not exist in template 
        new KeyValuePair<string, string>("@country@","The Netherlands"), 
    };
    var actual = ReplaceMultiple(template, …
Run Code Online (Sandbox Code Playgroud)

c# stringbuilder

3
推荐指数
1
解决办法
3342
查看次数

标签 统计

stringbuilder ×5

c# ×4

.net ×3

regex ×2

string ×2