diff --git a/src/benchmarks/micro/libraries/System.IO/BinaryWriterExtendedTests.cs b/src/benchmarks/micro/libraries/System.IO/BinaryWriterExtendedTests.cs index bf64a67cd7b..dae03a5b81c 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,96 @@ public void Setup() { _bw = new BinaryWriter(new NullWriteStream()); - _input = new string('x', StringLengthInChars); - _inputAsChars = _input.ToCharArray(); + _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(); } [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(); + // '\u00E0' (à) encodes to 2 bytes in UTF-8, exercising multi-byte encoding paths + _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..55e67e014db 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,33 @@ 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() + { + // '\u00E0' (à) encodes to 2 bytes in UTF-8, exercising multi-byte encoding paths + _bw.Write('\u00E0'); + } + } }