From 1e1e46b9d01985dd291e485b279ecb4239a08125 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Thu, 28 May 2026 19:36:05 +0100 Subject: [PATCH] perf: dedupe TestDataFormatter.FormatArguments with pooled StringBuilder Collapse the two duplicated FormatArguments overloads into one canonical implementation. The no-formatter overload now delegates to the formatter overload. Replace the string[] + string.Join intermediate allocation with a pooled StringBuilder from TUnit.Core.Helpers.StringBuilderPool. Behavior is identical; this reduces per-row allocations during display-name and data formatting. Closes #6038 --- TUnit.Core/DataSources/TestDataFormatter.cs | 33 ++++++++++----------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/TUnit.Core/DataSources/TestDataFormatter.cs b/TUnit.Core/DataSources/TestDataFormatter.cs index c7ecdf87cb..b1cd16f0aa 100644 --- a/TUnit.Core/DataSources/TestDataFormatter.cs +++ b/TUnit.Core/DataSources/TestDataFormatter.cs @@ -26,31 +26,30 @@ public static string FormatArguments(object?[] arguments, List 0) + { + builder.Append(", "); + } + builder.Append(ArgumentFormatter.Format(arguments[i], formatters)); + } + return builder.ToString(); + } + finally + { + StringBuilderPool.Return(builder); } - return string.Join(", ", formattedArgs); } /// /// Formats an array of arguments using default formatting /// public static string FormatArguments(object?[] arguments) - { - if (arguments.Length == 0) - { - return string.Empty; - } - - var formattedArgs = new string[arguments.Length]; - for (var i = 0; i < arguments.Length; i++) - { - formattedArgs[i] = ArgumentFormatter.Format(arguments[i], []); - } - return string.Join(", ", formattedArgs); - } + => FormatArguments(arguments, []); /// /// Creates a display name from test metadata and arguments