diff --git a/Benchmarks/Text/StringExtensions/ToStringEnumerable.cs b/Benchmarks/Text/StringExtensions/ToStringEnumerable.cs
new file mode 100644
index 0000000000..b44f33ad5e
--- /dev/null
+++ b/Benchmarks/Text/StringExtensions/ToStringEnumerable.cs
@@ -0,0 +1,84 @@
+using System.Text;
+using BenchmarkDotNet.Attributes;
+using Tui = Terminal.Gui;
+
+namespace Terminal.Gui.Benchmarks.Text.StringExtensions;
+
+///
+/// Benchmarks for performance fine-tuning.
+///
+[MemoryDiagnoser]
+public class ToStringEnumerable
+{
+
+ ///
+ /// Benchmark for previous implementation.
+ ///
+ [Benchmark]
+ [ArgumentsSource (nameof (DataSource))]
+ public string Previous (IEnumerable runes, int len)
+ {
+ return StringConcatInLoop (runes);
+ }
+
+ ///
+ /// Benchmark for current implementation with char buffer and
+ /// fallback to rune chars appending to StringBuilder.
+ ///
+ ///
+ ///
+ [Benchmark (Baseline = true)]
+ [ArgumentsSource (nameof (DataSource))]
+ public string Current (IEnumerable runes, int len)
+ {
+ return Tui.StringExtensions.ToString (runes);
+ }
+
+ ///
+ /// Previous implementation with string concatenation in a loop.
+ ///
+ private static string StringConcatInLoop (IEnumerable runes)
+ {
+ var str = string.Empty;
+
+ foreach (Rune rune in runes)
+ {
+ str += rune.ToString ();
+ }
+
+ return str;
+ }
+
+ public IEnumerable