Files
Terminal.Gui/Tests/Benchmarks/Text/RuneExtensions/GetEncodingLength.cs
Tig 0baa881dc5 Fixes #4046 - Moves examples into ./Examples and fixes ./Tests (#4047)
* touching publish.yml

* Moved Examples into ./Examples

* Moved Benchmarks into ./Tests

* Moved Benchmarks into ./Tests

* Moved UICatalog into ./Examples

* Moved UICatalog into ./Examples 2

* Moved tests into ./Tests

* Updated nuget
2025-04-25 09:49:33 -06:00

75 lines
2.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Text;
using BenchmarkDotNet.Attributes;
using Tui = Terminal.Gui;
namespace Terminal.Gui.Benchmarks.Text.RuneExtensions;
/// <summary>
/// Benchmarks for <see cref="Tui.RuneExtensions.GetEncodingLength"/> performance fine-tuning.
/// </summary>
[MemoryDiagnoser]
[BenchmarkCategory (nameof (Tui.RuneExtensions))]
public class GetEncodingLength
{
/// <summary>
/// Benchmark for previous implementation.
/// </summary>
[Benchmark]
[ArgumentsSource (nameof (DataSource))]
public int Previous (Rune rune, PrettyPrintedEncoding encoding)
{
return WithEncodingGetBytesArray (rune, encoding);
}
/// <summary>
/// Benchmark for current implementation.
/// </summary>
[Benchmark (Baseline = true)]
[ArgumentsSource (nameof (DataSource))]
public int Current (Rune rune, PrettyPrintedEncoding encoding)
{
return Tui.RuneExtensions.GetEncodingLength (rune, encoding);
}
/// <summary>
/// Previous implementation with intermediate byte array, string, and char array allocation.
/// </summary>
private static int WithEncodingGetBytesArray (Rune rune, Encoding? encoding = null)
{
encoding ??= Encoding.UTF8;
byte [] bytes = encoding.GetBytes (rune.ToString ().ToCharArray ());
var offset = 0;
if (bytes [^1] == 0)
{
offset++;
}
return bytes.Length - offset;
}
public static IEnumerable<object []> DataSource ()
{
PrettyPrintedEncoding[] encodings = [ new(Encoding.UTF8), new(Encoding.Unicode), new(Encoding.UTF32) ];
Rune[] runes = [ new Rune ('a'), "𝔹".EnumerateRunes ().Single () ];
foreach (var encoding in encodings)
{
foreach (Rune rune in runes)
{
yield return [rune, encoding];
}
}
}
/// <summary>
/// <see cref="System.Text.Encoding"/> wrapper to display proper encoding name in benchmark results.
/// </summary>
public record PrettyPrintedEncoding (Encoding Encoding)
{
public static implicit operator Encoding (PrettyPrintedEncoding ppe) => ppe.Encoding;
public override string ToString () => Encoding.HeaderName;
}
}