From dac463b196c938ec6c2adead0eb2effcad5a6f26 Mon Sep 17 00:00:00 2001 From: Joyless <65855333+Joy-less@users.noreply.github.com> Date: Fri, 28 Feb 2025 21:27:54 +0000 Subject: [PATCH 1/3] Perf optimization & simplification in Replace --- .../ValueStringBuilder.Replace.cs | 8 +------- .../ValueStringBuilderExtensions.cs | 2 +- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/LinkDotNet.StringBuilder/ValueStringBuilder.Replace.cs b/src/LinkDotNet.StringBuilder/ValueStringBuilder.Replace.cs index 967515f..f581ec8 100644 --- a/src/LinkDotNet.StringBuilder/ValueStringBuilder.Replace.cs +++ b/src/LinkDotNet.StringBuilder/ValueStringBuilder.Replace.cs @@ -26,13 +26,7 @@ public readonly void Replace(char oldValue, char newValue, int startIndex, int c ArgumentOutOfRangeException.ThrowIfLessThan(startIndex, 0); ArgumentOutOfRangeException.ThrowIfGreaterThan(startIndex + count, Length); - for (var i = startIndex; i < startIndex + count; i++) - { - if (buffer[i] == oldValue) - { - buffer[i] = newValue; - } - } + buffer.Slice(startIndex, count).Replace(oldValue, newValue); } /// diff --git a/src/LinkDotNet.StringBuilder/ValueStringBuilderExtensions.cs b/src/LinkDotNet.StringBuilder/ValueStringBuilderExtensions.cs index 4487bbe..1d9dc51 100644 --- a/src/LinkDotNet.StringBuilder/ValueStringBuilderExtensions.cs +++ b/src/LinkDotNet.StringBuilder/ValueStringBuilderExtensions.cs @@ -29,7 +29,7 @@ public static ValueStringBuilder ToValueStringBuilder(this System.Text.StringBui { ArgumentNullException.ThrowIfNull(builder); - var valueStringBuilder = new ValueStringBuilder(); + var valueStringBuilder = new ValueStringBuilder(builder.Length); foreach (var chunk in builder.GetChunks()) { valueStringBuilder.Append(chunk.Span); From 8814b6a9e071b61e1d8709abc3ca7749a0a743de Mon Sep 17 00:00:00 2001 From: Joyless <65855333+Joy-less@users.noreply.github.com> Date: Sat, 1 Mar 2025 00:02:16 +0000 Subject: [PATCH 2/3] Optimize replace with one-length spans --- src/LinkDotNet.StringBuilder/ValueStringBuilder.Replace.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/LinkDotNet.StringBuilder/ValueStringBuilder.Replace.cs b/src/LinkDotNet.StringBuilder/ValueStringBuilder.Replace.cs index f581ec8..ebf41f6 100644 --- a/src/LinkDotNet.StringBuilder/ValueStringBuilder.Replace.cs +++ b/src/LinkDotNet.StringBuilder/ValueStringBuilder.Replace.cs @@ -91,6 +91,12 @@ public void Replace(scoped ReadOnlySpan oldValue, scoped ReadOnlySpan Date: Mon, 3 Mar 2025 18:29:53 +0000 Subject: [PATCH 3/3] Update CHANGELOG.md --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 10eb412..4e82b2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ All notable changes to **ValueStringBuilder** will be documented in this file. T ## [Unreleased] +### Changed + +- Optimized `Replace(char, char)` (by @Joy-less in #241) +- Optimized `Replace(ReadOnlySpan, ReadOnlySpan)` when both spans are length 1 (by @Joy-less in #241) + ## [2.4.0] - 2025-02-21 ### Added