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