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'); } }