Skip to content

Add some BCL-like methods to StringBuilder #20

Merged
neuecc merged 7 commits intoCysharp:masterfrom
udaken:add-some-methods-to-StringBuilder
Jul 30, 2020
Merged

Add some BCL-like methods to StringBuilder #20
neuecc merged 7 commits intoCysharp:masterfrom
udaken:add-some-methods-to-StringBuilder

Conversation

@udaken
Copy link
Copy Markdown
Contributor

@udaken udaken commented Jul 3, 2020

Add the following methods.

struct Utf8ValueStringBuilder
{
  void Append(char value, int repeatCount);
  void Append(ReadOnlySpan<char> value);
  void AppendLine(ReadOnlySpan<char> value);
  void Clear();
}
struct Utf16ValueStringBuilder
{
  void Append(char value, int repeatCount);
  void AppendLine(ReadOnlySpan<char> value);
  void Clear();
  void Replace(char oldChar, char newChar);
  void Replace(char oldChar, char newChar, int startIndex, int count);
  void Replace(string oldValue, string newValue);
  void Replace(ReadOnlySpan<char> oldValue, ReadOnlySpan<char> newValue);
  void Replace(string oldValue, string newValue, int startIndex, int count);
  void Replace(ReadOnlySpan<char> oldValue, ReadOnlySpan<char> newValue, int startIndex, int count);
  void Remove(int startIndex, int length);
  void Insert(int index, string value, int count);
  void Insert(int index, string value);
  void Insert(int index, ReadOnlySpan<char> value, int count);
}

The Replace method has a speed and allocation advantage.
see sandbox/PerfBenchmark/Benchmarks/ReplaceBenchmark.cs

Details
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19042
AMD Ryzen 7 3700X, 1 CPU, 16 logical and 8 physical cores
.NET Core SDK=3.1.400-preview-015178
  [Host]   : .NET Core 3.1.5 (CoreCLR 4.700.20.26901, CoreFX 4.700.20.27001), X64 RyuJIT
  ShortRun : .NET Core 3.1.5 (CoreCLR 4.700.20.26901, CoreFX 4.700.20.27001), X64 RyuJIT

Job=ShortRun  IterationCount=1  LaunchCount=1
WarmupCount=1
Method Mean Error Gen 0 Gen 1 Gen 2 Allocated
ReplaceChar 56.17 ns NA - - - -
ZReplaceChar 49.23 ns NA - - - -
ReplaceString 465.33 ns NA 0.0448 - - 376 B
ZReplaceString 487.78 ns NA - - - -
NotReplaced 16,293.42 ns NA - - - -
ZNotReplaced 40.65 ns NA - - - -
ManyTimesReplace 1,436,636.52 ns NA - - - 4240 B
ZManyTimesReplace 3,029.78 ns NA - - - -

udaken added 4 commits July 3, 2020 22:07
- Utf8ValueStringBuilder.Append(char value, int repeatCount)
- Utf8ValueStringBuilder.Append(ReadOnlySpan<char> value)
- Utf8ValueStringBuilder.AppendLine(ReadOnlySpan<char> value)
- Utf8ValueStringBuilder.Clear()
- Utf16ValueStringBuilder.Append(char value, int repeatCount)
- Utf16ValueStringBuilder.AppendLine(ReadOnlySpan<char> value)
- Utf16ValueStringBuilder.Clear()
udaken added 3 commits July 6, 2020 11:37
- Utf16ValueStringBuilder.Insert(int index, string value, int count)
- Utf16ValueStringBuilder.Insert(int index, string value)
- Utf16ValueStringBuilder.Insert(int index, ReadOnlySpan<char> value, int count)
@udaken udaken force-pushed the add-some-methods-to-StringBuilder branch from d4576f0 to 4d8a383 Compare July 15, 2020 14:14
@neuecc
Copy link
Copy Markdown
Member

neuecc commented Jul 30, 2020

very interesting and great features, thank you!

@neuecc neuecc merged commit 6a39564 into Cysharp:master Jul 30, 2020
@udaken udaken deleted the add-some-methods-to-StringBuilder branch July 30, 2020 11:59
ThangwLee pushed a commit to WolffunGame/ZString that referenced this pull request May 26, 2023
…uilder

Add some BCL-like methods to StringBuilder
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants