From 8aba47ac3e7e9af24cfe93c8cf6414fa27edafaa Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 16 Feb 2026 02:15:48 +0000
Subject: [PATCH 1/3] Initial plan
From 22dfd0982adf7e7395abedc34433a0b77060f26b Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 16 Feb 2026 02:19:50 +0000
Subject: [PATCH 2/3] Add BinaryWriter benchmarks for _useFastUtf8 true and
false code paths
Co-authored-by: jeffhandley <1031940+jeffhandley@users.noreply.github.com>
---
.../System.IO/BinaryWriterExtendedTests.cs | 87 +++++++++++++++++--
.../libraries/System.IO/BinaryWriterTests.cs | 29 +++++++
2 files changed, 110 insertions(+), 6 deletions(-)
diff --git a/src/benchmarks/micro/libraries/System.IO/BinaryWriterExtendedTests.cs b/src/benchmarks/micro/libraries/System.IO/BinaryWriterExtendedTests.cs
index bf64a67cd7b..f6d191abecd 100644
--- a/src/benchmarks/micro/libraries/System.IO/BinaryWriterExtendedTests.cs
+++ b/src/benchmarks/micro/libraries/System.IO/BinaryWriterExtendedTests.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using System.Text;
using BenchmarkDotNet.Attributes;
using MicroBenchmarks;
@@ -10,8 +11,10 @@ namespace System.IO.Tests
[BenchmarkCategory(Categories.Libraries)]
public class BinaryWriterExtendedTests
{
- private string _input;
- private char[] _inputAsChars;
+ private string _asciiInput;
+ private char[] _asciiInputAsChars;
+ private string _nonAsciiInput;
+ private char[] _nonAsciiInputAsChars;
private BinaryWriter _bw;
[Params(32, 8_000, 2_000_000)]
@@ -22,22 +25,94 @@ public void Setup()
{
_bw = new BinaryWriter(new NullWriteStream());
- _input = new string('x', StringLengthInChars);
- _inputAsChars = _input.ToCharArray();
+ _asciiInput = new string('x', StringLengthInChars);
+ _asciiInputAsChars = _asciiInput.ToCharArray();
+ _nonAsciiInput = new string('\u00E0', StringLengthInChars);
+ _nonAsciiInputAsChars = _nonAsciiInput.ToCharArray();
}
[Benchmark]
[MemoryRandomization]
public void WriteAsciiCharArray()
{
- _bw.Write(_inputAsChars);
+ _bw.Write(_asciiInputAsChars);
}
[Benchmark]
[MemoryRandomization]
public void WriteAsciiString()
{
- _bw.Write(_input);
+ _bw.Write(_asciiInput);
+ }
+
+ [Benchmark]
+ [MemoryRandomization]
+ public void WriteNonAsciiCharArray()
+ {
+ _bw.Write(_nonAsciiInputAsChars);
+ }
+
+ [Benchmark]
+ [MemoryRandomization]
+ public void WriteNonAsciiString()
+ {
+ _bw.Write(_nonAsciiInput);
+ }
+ }
+
+ ///
+ /// Benchmarks for BinaryWriter with a non-UTF-8 encoding, exercising the
+ /// _useFastUtf8 = false code path.
+ ///
+ [BenchmarkCategory(Categories.Libraries)]
+ public class BinaryWriterUnicodeEncodingTests
+ {
+ private string _asciiInput;
+ private char[] _asciiInputAsChars;
+ private string _nonAsciiInput;
+ private char[] _nonAsciiInputAsChars;
+ private BinaryWriter _bw;
+
+ [Params(32, 8_000, 2_000_000)]
+ public int StringLengthInChars;
+
+ [GlobalSetup]
+ public void Setup()
+ {
+ _bw = new BinaryWriter(new NullWriteStream(), Encoding.Unicode);
+
+ _asciiInput = new string('x', StringLengthInChars);
+ _asciiInputAsChars = _asciiInput.ToCharArray();
+ _nonAsciiInput = new string('\u00E0', StringLengthInChars);
+ _nonAsciiInputAsChars = _nonAsciiInput.ToCharArray();
+ }
+
+ [Benchmark]
+ [MemoryRandomization]
+ public void WriteAsciiCharArray()
+ {
+ _bw.Write(_asciiInputAsChars);
+ }
+
+ [Benchmark]
+ [MemoryRandomization]
+ public void WriteAsciiString()
+ {
+ _bw.Write(_asciiInput);
+ }
+
+ [Benchmark]
+ [MemoryRandomization]
+ public void WriteNonAsciiCharArray()
+ {
+ _bw.Write(_nonAsciiInputAsChars);
+ }
+
+ [Benchmark]
+ [MemoryRandomization]
+ public void WriteNonAsciiString()
+ {
+ _bw.Write(_nonAsciiInput);
}
}
}
diff --git a/src/benchmarks/micro/libraries/System.IO/BinaryWriterTests.cs b/src/benchmarks/micro/libraries/System.IO/BinaryWriterTests.cs
index 7a9f9e5293f..f5bc5afde31 100644
--- a/src/benchmarks/micro/libraries/System.IO/BinaryWriterTests.cs
+++ b/src/benchmarks/micro/libraries/System.IO/BinaryWriterTests.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using System.Text;
using BenchmarkDotNet.Attributes;
using MicroBenchmarks;
@@ -78,4 +79,32 @@ public void WriteDouble()
_bw.Write((double)Math.PI);
}
}
+
+ ///
+ /// Benchmarks for BinaryWriter with a non-UTF-8 encoding, exercising the
+ /// _useFastUtf8 = false code path for Write(char).
+ ///
+ [BenchmarkCategory(Categories.Libraries)]
+ public class BinaryWriterUnicodeEncodingCharTests
+ {
+ private BinaryWriter _bw;
+
+ [GlobalSetup]
+ public void Setup()
+ {
+ _bw = new BinaryWriter(new NullWriteStream(), Encoding.Unicode);
+ }
+
+ [Benchmark]
+ public void WriteAsciiChar()
+ {
+ _bw.Write('a');
+ }
+
+ [Benchmark]
+ public void WriteNonAsciiChar()
+ {
+ _bw.Write('\u00E0');
+ }
+ }
}
From c0cca99d2dba0f42f97f0cdd8d36993665431cea Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 16 Feb 2026 02:41:20 +0000
Subject: [PATCH 3/3] Add comments explaining significance of '\u00E0'
character selection
Co-authored-by: jeffhandley <1031940+jeffhandley@users.noreply.github.com>
---
.../micro/libraries/System.IO/BinaryWriterExtendedTests.cs | 2 ++
src/benchmarks/micro/libraries/System.IO/BinaryWriterTests.cs | 1 +
2 files changed, 3 insertions(+)
diff --git a/src/benchmarks/micro/libraries/System.IO/BinaryWriterExtendedTests.cs b/src/benchmarks/micro/libraries/System.IO/BinaryWriterExtendedTests.cs
index f6d191abecd..dae03a5b81c 100644
--- a/src/benchmarks/micro/libraries/System.IO/BinaryWriterExtendedTests.cs
+++ b/src/benchmarks/micro/libraries/System.IO/BinaryWriterExtendedTests.cs
@@ -27,6 +27,7 @@ public void Setup()
_asciiInput = new string('x', StringLengthInChars);
_asciiInputAsChars = _asciiInput.ToCharArray();
+ // '\u00E0' (à) encodes to 2 bytes in UTF-8, exercising multi-byte encoding paths
_nonAsciiInput = new string('\u00E0', StringLengthInChars);
_nonAsciiInputAsChars = _nonAsciiInput.ToCharArray();
}
@@ -83,6 +84,7 @@ public void Setup()
_asciiInput = new string('x', StringLengthInChars);
_asciiInputAsChars = _asciiInput.ToCharArray();
+ // '\u00E0' (à) encodes to 2 bytes in UTF-8, exercising multi-byte encoding paths
_nonAsciiInput = new string('\u00E0', StringLengthInChars);
_nonAsciiInputAsChars = _nonAsciiInput.ToCharArray();
}
diff --git a/src/benchmarks/micro/libraries/System.IO/BinaryWriterTests.cs b/src/benchmarks/micro/libraries/System.IO/BinaryWriterTests.cs
index f5bc5afde31..55e67e014db 100644
--- a/src/benchmarks/micro/libraries/System.IO/BinaryWriterTests.cs
+++ b/src/benchmarks/micro/libraries/System.IO/BinaryWriterTests.cs
@@ -104,6 +104,7 @@ public void WriteAsciiChar()
[Benchmark]
public void WriteNonAsciiChar()
{
+ // '\u00E0' (à) encodes to 2 bytes in UTF-8, exercising multi-byte encoding paths
_bw.Write('\u00E0');
}
}