From e6e2ae3b139f098b6623bde322609488f79b291e Mon Sep 17 00:00:00 2001 From: Yat Long Poon Date: Tue, 4 Nov 2025 16:52:17 +0000 Subject: [PATCH] Improve granularity of Perf.Utf8Encoding benchmarks Implement the suggestions from #1512: * Break down benchmarks for Unicode validation and transcoding. * Call from `Encoding.UTF8` so that devirtualization can be tested. --- .../System.Text.Encoding/Perf.Utf8Encoding.cs | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/benchmarks/micro/libraries/System.Text.Encoding/Perf.Utf8Encoding.cs b/src/benchmarks/micro/libraries/System.Text.Encoding/Perf.Utf8Encoding.cs index 0543700ef25..2c1d691f064 100644 --- a/src/benchmarks/micro/libraries/System.Text.Encoding/Perf.Utf8Encoding.cs +++ b/src/benchmarks/micro/libraries/System.Text.Encoding/Perf.Utf8Encoding.cs @@ -11,26 +11,36 @@ namespace System.Text [BenchmarkCategory(Categories.Libraries, Categories.Runtime)] public class Perf_Utf8Encoding : Perf_TextBase { - private string _unicode; + private string _string; private byte[] _bytes; - private UTF8Encoding _utf8Encoding; + private char[] _chars; [GlobalSetup] public void Setup() { - _unicode = File.ReadAllText(Path.Combine(TextFilesRootPath, $"{Input}.txt")); - _utf8Encoding = new UTF8Encoding(); - _bytes = _utf8Encoding.GetBytes(_unicode); + _string = File.ReadAllText(Path.Combine(TextFilesRootPath, $"{Input}.txt")); + _bytes = Encoding.UTF8.GetBytes(_string); + _chars = _string.ToCharArray(); } [Benchmark] [MemoryRandomization] - public int GetByteCount() => _utf8Encoding.GetByteCount(_unicode); + public int GetByteCount() => Encoding.UTF8.GetByteCount(_string); [Benchmark] - public byte[] GetBytes() => _utf8Encoding.GetBytes(_unicode); + [MemoryRandomization] + public int GetCharCount() => Encoding.UTF8.GetCharCount(_bytes); + + [Benchmark] + public int GetBytesFromChars() => Encoding.UTF8.GetBytes(_chars.AsSpan(), _bytes); + + [Benchmark] + public int GetCharsFromBytes() => Encoding.UTF8.GetChars(_bytes.AsSpan(), _chars); + + [Benchmark] + public string GetStringFromBytes() => Encoding.UTF8.GetString(_bytes); [Benchmark] - public string GetString() => _utf8Encoding.GetString(_bytes); + public byte[] GetBytesFromString() => Encoding.UTF8.GetBytes(_string); } }