mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-26 15:57:56 +01:00
* Add benchmarks for potentially optimizable RuneExtensions * Add new RuneExtensions.DecodeSurrogatePair benchmark implementation Avoids intermediate heap array allocations which is especially nice when the rune is not surrogate pair because then array heap allocations are completely avoided. * Enable nullable reference types in RuneExtensions * Make RuneExtensions.MaxUnicodeCodePoint readonly Makes sure no one can accidentally change the value. Ideally would be const value. * Optimize RuneExtensions.DecodeSurrogatePair * Remove duplicate Rune.GetUnicodeCategory call * Add new RuneExtensions.IsSurrogatePair benchmark implementation Avoids intermediate heap allocations by using stack allocated buffer. * Optimize RuneExtensions.IsSurrogatePair * Add RuneExtensions.GetEncodingLength tests * Optimize RuneExtensions.GetEncodingLength * Optimize RuneExtensions.Encode * Print encoding name in benchmark results * Rename variable to better match return description * Add RuneExtensions.EncodeSurrogatePair benchmark --------- Co-authored-by: Tig <tig@users.noreply.github.com>
37 lines
1.0 KiB
C#
37 lines
1.0 KiB
C#
using System.Text;
|
|
using BenchmarkDotNet.Attributes;
|
|
using Tui = Terminal.Gui;
|
|
|
|
namespace Terminal.Gui.Benchmarks.Text.RuneExtensions;
|
|
|
|
/// <summary>
|
|
/// Benchmarks for <see cref="Tui.RuneExtensions.EncodeSurrogatePair"/> performance fine-tuning.
|
|
/// </summary>
|
|
[MemoryDiagnoser]
|
|
[BenchmarkCategory (nameof (Tui.RuneExtensions))]
|
|
public class EncodeSurrogatePair
|
|
{
|
|
/// <summary>
|
|
/// Benchmark for current implementation.
|
|
/// </summary>
|
|
[Benchmark (Baseline = true)]
|
|
[ArgumentsSource (nameof (DataSource))]
|
|
public Rune Current (char highSurrogate, char lowSurrogate)
|
|
{
|
|
_ = Tui.RuneExtensions.EncodeSurrogatePair (highSurrogate, lowSurrogate, out Rune rune);
|
|
return rune;
|
|
}
|
|
|
|
public static IEnumerable<object []> DataSource ()
|
|
{
|
|
string[] runeStrings = ["🍕", "🧠", "🌹"];
|
|
foreach (string symbol in runeStrings)
|
|
{
|
|
if (symbol is [char high, char low])
|
|
{
|
|
yield return [high, low];
|
|
}
|
|
}
|
|
}
|
|
}
|