diff --git a/src/BenchmarkDotNet.Diagnostics.Windows/Tracing/NativeMemoryLogParser.cs b/src/BenchmarkDotNet.Diagnostics.Windows/Tracing/NativeMemoryLogParser.cs
index 3935cd4cd4..7510a4eb8c 100644
--- a/src/BenchmarkDotNet.Diagnostics.Windows/Tracing/NativeMemoryLogParser.cs
+++ b/src/BenchmarkDotNet.Diagnostics.Windows/Tracing/NativeMemoryLogParser.cs
@@ -1,6 +1,7 @@
using BenchmarkDotNet.Diagnosers;
using BenchmarkDotNet.Engines;
using BenchmarkDotNet.Extensions;
+using BenchmarkDotNet.Helpers;
using BenchmarkDotNet.Loggers;
using BenchmarkDotNet.Reports;
using BenchmarkDotNet.Running;
@@ -245,7 +246,7 @@ bool IsCallStackIn(StackSourceCallStackIndex index)
logger.WriteLine(
$"Native memory allocated per single operation: " +
- $"{PerfolizerMeasurementFormatter.Instance.Format(
+ $"{UnitHelper.Format(
SizeValue.FromBytes(memoryAllocatedPerOperation).ToMeasurement(SizeUnit.B),
formatProvider: benchmarkCase.Config.CultureInfo)}");
logger.WriteLine($"Count of allocated object: {countOfAllocatedObject / totalOperation}");
@@ -254,7 +255,7 @@ bool IsCallStackIn(StackSourceCallStackIndex index)
{
logger.WriteLine(
$"Native memory leak per single operation: " +
- $"{PerfolizerMeasurementFormatter.Instance.Format(
+ $"{UnitHelper.Format(
SizeValue.FromBytes(memoryLeakPerOperation).ToMeasurement(SizeUnit.B),
formatProvider: benchmarkCase.Config.CultureInfo)}");
}
diff --git a/src/BenchmarkDotNet/Analysers/ZeroMeasurementHelper.cs b/src/BenchmarkDotNet/Analysers/ZeroMeasurementHelper.cs
index 2b8938bcfc..60891d1c6e 100644
--- a/src/BenchmarkDotNet/Analysers/ZeroMeasurementHelper.cs
+++ b/src/BenchmarkDotNet/Analysers/ZeroMeasurementHelper.cs
@@ -6,6 +6,7 @@
using Perfolizer.Metrology;
using Pragmastat;
using Pragmastat.Estimators;
+using Threshold = Perfolizer.Metrology.Threshold;
namespace BenchmarkDotNet.Analysers
{
@@ -24,7 +25,15 @@ public static bool AreIndistinguishable(double[] workload, double[] overhead, Th
public static bool AreIndistinguishable(Sample workload, Sample overhead, Threshold? threshold = null)
{
threshold ??= MathHelper.DefaultThreshold;
+ // Perfolizer deprecated its significance testing API in favor of Pragmastat.Toolkit.Compare2.
+ // Compare2 reports per-metric verdicts against typed thresholds instead of a single
+ // equivalence result, so adopting it would change every verdict this codebase produces:
+ // zero-measurement detection, ranks, and the statistical test column. Staying on the
+ // deprecated path keeps the current statistics intact; the switch needs its own change,
+ // with its own validation against real runs.
+#pragma warning disable CS0618 // Type or member is obsolete
var tost = new SimpleEquivalenceTest(MannWhitneyTest.Instance);
+#pragma warning restore CS0618
if (workload.Size == 1 || overhead.Size == 1)
return false;
return tost.Perform(workload, overhead, threshold, SignificanceLevel.P1E5) == ComparisonResult.Indistinguishable;
diff --git a/src/BenchmarkDotNet/BenchmarkDotNet.csproj b/src/BenchmarkDotNet/BenchmarkDotNet.csproj
index 3eea2ce96b..751b75a5da 100644
--- a/src/BenchmarkDotNet/BenchmarkDotNet.csproj
+++ b/src/BenchmarkDotNet/BenchmarkDotNet.csproj
@@ -28,7 +28,7 @@
-
+
diff --git a/src/BenchmarkDotNet/Columns/MetricColumn.cs b/src/BenchmarkDotNet/Columns/MetricColumn.cs
index 8ca2ded7b1..320085e34a 100644
--- a/src/BenchmarkDotNet/Columns/MetricColumn.cs
+++ b/src/BenchmarkDotNet/Columns/MetricColumn.cs
@@ -1,4 +1,5 @@
using BenchmarkDotNet.Extensions;
+using BenchmarkDotNet.Helpers;
using BenchmarkDotNet.Reports;
using BenchmarkDotNet.Running;
using Perfolizer.Horology;
@@ -44,25 +45,24 @@ public string GetValue(Summary summary, BenchmarkCase benchmarkCase, SummaryStyl
var cultureInfo = summary.GetCultureInfo();
bool printUnits = style.PrintUnitsInContent || style.PrintUnitsInHeader;
- var unitPresentation = new UnitPresentation(style.PrintUnitsInContent, minUnitWidth: 0, gap: true);
string numberFormat = descriptor.NumberFormat;
if (printUnits && descriptor.UnitType == UnitType.CodeSize)
{
var measurement = SizeValue.FromBytes((long)metric.Value).ToMeasurement(style.CodeSizeUnit);
- return PerfolizerMeasurementFormatter.Instance.Format(measurement, numberFormat, cultureInfo, unitPresentation);
+ return UnitHelper.Format(measurement, numberFormat, cultureInfo, style.PrintUnitsInContent);
}
if (printUnits && descriptor.UnitType == UnitType.Size)
{
var measurement = SizeValue.FromBytes((long)metric.Value).ToMeasurement(style.SizeUnit);
- return PerfolizerMeasurementFormatter.Instance.Format(measurement, numberFormat, cultureInfo, unitPresentation);
+ return UnitHelper.Format(measurement, numberFormat, cultureInfo, style.PrintUnitsInContent);
}
if (printUnits && descriptor.UnitType == UnitType.Time)
{
if (numberFormat.IsBlank())
numberFormat = "N4";
var measurement = TimeInterval.FromNanoseconds(metric.Value).ToMeasurement(style.TimeUnit);
- return PerfolizerMeasurementFormatter.Instance.Format(measurement, numberFormat, cultureInfo, unitPresentation);
+ return UnitHelper.Format(measurement, numberFormat, cultureInfo, style.PrintUnitsInContent);
}
return metric.Value.ToString(numberFormat, cultureInfo);
diff --git a/src/BenchmarkDotNet/Columns/StatisticColumn.cs b/src/BenchmarkDotNet/Columns/StatisticColumn.cs
index 79df132915..d12b844b2c 100644
--- a/src/BenchmarkDotNet/Columns/StatisticColumn.cs
+++ b/src/BenchmarkDotNet/Columns/StatisticColumn.cs
@@ -1,4 +1,5 @@
using BenchmarkDotNet.Configs;
+using BenchmarkDotNet.Helpers;
using BenchmarkDotNet.Mathematics;
using BenchmarkDotNet.Reports;
using BenchmarkDotNet.Running;
@@ -151,11 +152,11 @@ private string Format(Summary summary, ImmutableConfig config, Statistics? stati
if (double.IsNaN(value))
return "NA";
return UnitType == UnitType.Time
- ? PerfolizerMeasurementFormatter.Instance.Format(
+ ? UnitHelper.Format(
TimeInterval.FromNanoseconds(value).ToMeasurement(style.TimeUnit),
format,
style.CultureInfo,
- new UnitPresentation(style.PrintUnitsInContent, minUnitWidth: 0, gap: true))
+ style.PrintUnitsInContent)
: value.ToString(format, style.CultureInfo);
}
diff --git a/src/BenchmarkDotNet/Columns/StatisticalTestColumn.cs b/src/BenchmarkDotNet/Columns/StatisticalTestColumn.cs
index f4e40ebdc7..691c6d07b1 100644
--- a/src/BenchmarkDotNet/Columns/StatisticalTestColumn.cs
+++ b/src/BenchmarkDotNet/Columns/StatisticalTestColumn.cs
@@ -1,3 +1,4 @@
+using BenchmarkDotNet.Helpers;
using BenchmarkDotNet.Mathematics;
using BenchmarkDotNet.Reports;
using BenchmarkDotNet.Running;
@@ -18,7 +19,7 @@ public class StatisticalTestColumn(Threshold threshold, SignificanceLevel? signi
public static StatisticalTestColumn Create(string threshold, SignificanceLevel? significanceLevel = null)
{
- if (!Threshold.TryParse(threshold, out var parsedThreshold))
+ if (!Threshold.TryParse(UnitHelper.NormalizeUnits(threshold), out var parsedThreshold))
throw new ArgumentException($"Can't parse threshold '{threshold}'");
return new StatisticalTestColumn(parsedThreshold, significanceLevel);
}
@@ -37,7 +38,11 @@ public override string GetValue(Summary summary, BenchmarkCase benchmarkCase, St
if (current.Sample.Size == 1 && baseline.Sample.Size == 1)
return "?";
+ // See ZeroMeasurementHelper: moving to Pragmastat.Toolkit.Compare2 would change the
+ // reported verdicts, so it needs its own change rather than riding along with a bump.
+#pragma warning disable CS0618 // Type or member is obsolete
var test = new SimpleEquivalenceTest(MannWhitneyTest.Instance);
+#pragma warning restore CS0618
var comparisonResult = test.Perform(current.Sample, baseline.Sample, Threshold, SignificanceLevel);
return comparisonResult switch
{
diff --git a/src/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs b/src/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs
index c582bd234a..671383aee7 100644
--- a/src/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs
+++ b/src/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs
@@ -318,7 +318,7 @@ private static bool Validate(CommandLineOptions options, ILogger logger)
if (options.StatisticalTestThreshold.IsNotBlank())
{
- options.StatisticalTestThreshold = options.StatisticalTestThreshold.Trim();
+ options.StatisticalTestThreshold = UnitHelper.NormalizeUnits(options.StatisticalTestThreshold.Trim());
if (IsUnitlessNumber(options.StatisticalTestThreshold))
{
string original = options.StatisticalTestThreshold;
diff --git a/src/BenchmarkDotNet/Environments/HostEnvironmentInfo.cs b/src/BenchmarkDotNet/Environments/HostEnvironmentInfo.cs
index 051edb3e23..cca0dabf54 100644
--- a/src/BenchmarkDotNet/Environments/HostEnvironmentInfo.cs
+++ b/src/BenchmarkDotNet/Environments/HostEnvironmentInfo.cs
@@ -99,13 +99,8 @@ public override IEnumerable ToFormattedString()
if (HardwareTimerKind != HardwareTimerKind.Unknown)
{
- string frequency = PerfolizerMeasurementFormatter.Instance.Format(
- ChronometerFrequency.ToMeasurement(FrequencyUnit.Hz),
- unitPresentation: UnitHelper.DefaultPresentation);
- string resolution = PerfolizerMeasurementFormatter.Instance.Format(
- ChronometerResolution.ToMeasurement(),
- format: "0.000",
- unitPresentation: UnitHelper.DefaultPresentation);
+ string frequency = UnitHelper.Format(ChronometerFrequency.ToMeasurement(FrequencyUnit.Hz));
+ string resolution = UnitHelper.Format(ChronometerResolution.ToMeasurement(), format: "0.000");
string timer = HardwareTimerKind.ToString().ToUpper();
yield return $"Frequency: {frequency}, Resolution: {resolution}, Timer: {timer}";
}
diff --git a/src/BenchmarkDotNet/Extensions/CommonExtensions.cs b/src/BenchmarkDotNet/Extensions/CommonExtensions.cs
index 467468cc1c..b79bd41654 100644
--- a/src/BenchmarkDotNet/Extensions/CommonExtensions.cs
+++ b/src/BenchmarkDotNet/Extensions/CommonExtensions.cs
@@ -1,4 +1,5 @@
using BenchmarkDotNet.Columns;
+using BenchmarkDotNet.Helpers;
using BenchmarkDotNet.Reports;
using System.Diagnostics.CodeAnalysis;
@@ -17,14 +18,14 @@ public static string GetColumnTitle(this IColumn column, SummaryStyle style)
switch (column.UnitType)
{
case UnitType.CodeSize:
- return $"{column.ColumnName} [{style.CodeSizeUnit.Abbreviation}]";
+ return $"{column.ColumnName} [{style.CodeSizeUnit.GetAbbreviation()}]";
case UnitType.Size:
return style.SizeUnit != null
- ? $"{column.ColumnName} [{style.SizeUnit.Abbreviation}]"
+ ? $"{column.ColumnName} [{style.SizeUnit.GetAbbreviation()}]"
: $"{column.ColumnName}";
case UnitType.Time:
return style.TimeUnit != null
- ? $"{column.ColumnName} [{style.TimeUnit.Abbreviation}]"
+ ? $"{column.ColumnName} [{style.TimeUnit.GetAbbreviation()}]"
: $"{column.ColumnName}";
case UnitType.Dimensionless:
return column.ColumnName;
diff --git a/src/BenchmarkDotNet/Extensions/StatisticsExtensions.cs b/src/BenchmarkDotNet/Extensions/StatisticsExtensions.cs
index fc8eb46212..00489e5758 100644
--- a/src/BenchmarkDotNet/Extensions/StatisticsExtensions.cs
+++ b/src/BenchmarkDotNet/Extensions/StatisticsExtensions.cs
@@ -17,9 +17,9 @@ public static class StatisticsExtensions
public static Func CreateNanosecondFormatter(this Statistics s, CultureInfo cultureInfo, string format = "N3")
{
var timeUnit = TimeUnit.GetBestTimeUnit(s.Mean);
- return x => PerfolizerMeasurementFormatter.Instance.Format(
+ return x => UnitHelper.Format(
TimeInterval.FromNanoseconds(x).ToMeasurement(timeUnit),
- format, cultureInfo, UnitHelper.DefaultPresentation
+ format, cultureInfo
);
}
diff --git a/src/BenchmarkDotNet/Helpers/AsciiHelper.cs b/src/BenchmarkDotNet/Helpers/AsciiHelper.cs
index a0ceff7252..bbe4ae77b0 100644
--- a/src/BenchmarkDotNet/Helpers/AsciiHelper.cs
+++ b/src/BenchmarkDotNet/Helpers/AsciiHelper.cs
@@ -5,7 +5,7 @@ internal static class AsciiHelper
///
/// The 'μ' symbol
///
- private const string Mu = "\u03BC";
+ internal const string Mu = "\u03BC";
public static string ToAscii(this string s)
{
diff --git a/src/BenchmarkDotNet/Helpers/UnitHelper.cs b/src/BenchmarkDotNet/Helpers/UnitHelper.cs
index 68aa903c9e..2cef38c7de 100644
--- a/src/BenchmarkDotNet/Helpers/UnitHelper.cs
+++ b/src/BenchmarkDotNet/Helpers/UnitHelper.cs
@@ -1,3 +1,5 @@
+using System;
+using System.Globalization;
using Perfolizer.Horology;
using Pragmastat.Metrology;
@@ -5,7 +7,32 @@ namespace BenchmarkDotNet.Helpers;
public static class UnitHelper
{
- public static readonly UnitPresentation DefaultPresentation = new(true, 0, gap: true);
+ ///
+ /// The abbreviation to print for the given unit.
+ /// Perfolizer reports ASCII-only abbreviations ("us"), while BenchmarkDotNet prints the Unicode ones ("μs")
+ /// and downgrades them via ToAscii for terminals without Unicode support.
+ ///
+ public static string GetAbbreviation(this MeasurementUnit unit) =>
+ unit == TimeUnit.Microsecond ? AsciiHelper.Mu + "s" : unit.Abbreviation;
- public static string ToDefaultString(this TimeInterval timeInterval, string? format = null) => timeInterval.ToString(format, null, DefaultPresentation);
-}
\ No newline at end of file
+ ///
+ /// Formats a measurement the way BenchmarkDotNet presents it:
+ /// the nominal value, a gap, and the unit abbreviation.
+ ///
+ public static string Format(Measurement measurement, string? format = null,
+ IFormatProvider? formatProvider = null, bool printUnit = true)
+ {
+ string nominalPart = measurement.NominalValue.ToString(format, formatProvider ?? CultureInfo.InvariantCulture);
+ string abbreviation = measurement.Unit.GetAbbreviation();
+ return printUnit && abbreviation.Length > 0 ? $"{nominalPart} {abbreviation}" : nominalPart;
+ }
+
+ ///
+ /// Normalizes user input so that units can be spelled with Unicode abbreviations ("5μs")
+ /// even though Perfolizer parsers only know the ASCII ones.
+ ///
+ public static string NormalizeUnits(string s) => s.ToAscii();
+
+ public static string ToDefaultString(this TimeInterval timeInterval, string? format = null) =>
+ Format(timeInterval.ToMeasurement(), format ?? "0.###");
+}
diff --git a/src/BenchmarkDotNet/Mathematics/RankHelper.cs b/src/BenchmarkDotNet/Mathematics/RankHelper.cs
index 6d19dce436..c84bdc4a09 100644
--- a/src/BenchmarkDotNet/Mathematics/RankHelper.cs
+++ b/src/BenchmarkDotNet/Mathematics/RankHelper.cs
@@ -29,7 +29,11 @@ public static int[] GetRanks(params Statistics[] stats)
private static bool AreSame(Statistics x, Statistics y)
{
+ // See ZeroMeasurementHelper: moving to Pragmastat.Toolkit.Compare2 would change the
+ // computed ranks, so it needs its own change rather than riding along with a bump.
+#pragma warning disable CS0618 // Type or member is obsolete
var test = new SimpleEquivalenceTest(MannWhitneyTest.Instance);
+#pragma warning restore CS0618
var comparisonResult = test.Perform(x.Sample, y.Sample, MathHelper.DefaultThreshold, MathHelper.DefaultSignificanceLevel);
return comparisonResult == ComparisonResult.Indistinguishable;
}
diff --git a/src/BenchmarkDotNet/Running/BenchmarkRunnerClean.cs b/src/BenchmarkDotNet/Running/BenchmarkRunnerClean.cs
index f8a23c07ed..70b02d75bb 100644
--- a/src/BenchmarkDotNet/Running/BenchmarkRunnerClean.cs
+++ b/src/BenchmarkDotNet/Running/BenchmarkRunnerClean.cs
@@ -376,13 +376,13 @@ private static async ValueTask PrintSummary(ILogger logger, ImmutableConfig conf
if (columnWithLegends.Any())
maxNameWidth = Math.Max(maxNameWidth, columnWithLegends.Select(c => c.ColumnName.Length).Max());
if (effectiveTimeUnit != null)
- maxNameWidth = Math.Max(maxNameWidth, effectiveTimeUnit.Abbreviation.ToString(cultureInfo).Length + 2);
+ maxNameWidth = Math.Max(maxNameWidth, effectiveTimeUnit.GetAbbreviation().ToString(cultureInfo).Length + 2);
foreach (var column in columnWithLegends)
logger.WriteLineHint($" {column.ColumnName.PadRight(maxNameWidth, ' ')} : {column.Legend}");
if (effectiveTimeUnit != null)
- logger.WriteLineHint($" {("1 " + effectiveTimeUnit.Abbreviation).PadRight(maxNameWidth, ' ')} :" +
+ logger.WriteLineHint($" {("1 " + effectiveTimeUnit.GetAbbreviation()).PadRight(maxNameWidth, ' ')} :" +
$" 1 {effectiveTimeUnit.FullName} ({TimeUnit.Convert(1, effectiveTimeUnit, TimeUnit.Second).ToString("0.#########", summary.GetCultureInfo())} sec)");
}
diff --git a/tests/BenchmarkDotNet.Tests/Perfonar/Infra/PerfonarTestExtensions.cs b/tests/BenchmarkDotNet.Tests/Perfonar/Infra/PerfonarTestExtensions.cs
index f2828b0882..3200e9d1bf 100644
--- a/tests/BenchmarkDotNet.Tests/Perfonar/Infra/PerfonarTestExtensions.cs
+++ b/tests/BenchmarkDotNet.Tests/Perfonar/Infra/PerfonarTestExtensions.cs
@@ -9,7 +9,7 @@ public static EntryInfo AddMetrics(this EntryInfo entry, params string[] metrics
{
for (int i = 0; i < metrics.Length; i++)
{
- var measurement = PerfolizerMeasurementFormatter.Instance.Parse(metrics[i]);
+ var measurement = MeasurementFormatter.Default.Parse(metrics[i]);
entry.Add(new EntryInfo
{
IterationIndex = i,
diff --git a/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default01.verified.txt b/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default01.verified.txt
index 9fe1919a4e..444141873c 100644
--- a/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default01.verified.txt
+++ b/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default01.verified.txt
@@ -3,10 +3,10 @@ MockIntel Core i7-6700HQ CPU 2.60GHz (Max: 3.10GHz), 1 CPU, 8 logical and 4 phys
Type = Bench
-| Method | Center | Spread |
-|:-------|---------:|--------:|
-| Foo | 11.0 ns | 0.81 ns |
-| Bar | 201.0 ns | 0.81 ns |
+| Method | Center | Spread |
+|:-------|--------:|-------:|
+| Foo | 11.0ns | 0.81ns |
+| Bar | 201.0ns | 0.81ns |
{
"engine": {
diff --git a/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default02.verified.txt b/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default02.verified.txt
index a3ade54aea..dfbf9bdcaa 100644
--- a/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default02.verified.txt
+++ b/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default02.verified.txt
@@ -3,12 +3,12 @@ MockIntel Core i7-6700HQ CPU 2.60GHz (Max: 3.10GHz), 1 CPU, 8 logical and 4 phys
Type = Bench
-| Method | Runtime | Center | Spread |
-|:-------|:--------|--------:|--------:|
-| Foo | Net481 | 11.0 ns | 0.81 ns |
-| Bar | Net481 | 21.0 ns | 0.81 ns |
-| Foo | Net70 | 31.0 ns | 0.81 ns |
-| Bar | Net70 | 41.0 ns | 0.81 ns |
+| Method | Runtime | Center | Spread |
+|:-------|:--------|-------:|-------:|
+| Foo | Net481 | 11.0ns | 0.81ns |
+| Bar | Net481 | 21.0ns | 0.81ns |
+| Foo | Net70 | 31.0ns | 0.81ns |
+| Bar | Net70 | 41.0ns | 0.81ns |
{
"engine": {
diff --git a/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default03.verified.txt b/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default03.verified.txt
index a940585663..6d4df1ab14 100644
--- a/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default03.verified.txt
+++ b/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default03.verified.txt
@@ -3,10 +3,10 @@ MockIntel Core i7-6700HQ CPU 2.60GHz (Max: 3.10GHz), 1 CPU, 8 logical and 4 phys
Type = Bench, Runtime = Net70, Jit = RyuJit
-| Method | Center | Spread |
-|:-------|--------:|--------:|
-| Foo | 31.0 ns | 0.81 ns |
-| Bar | 41.0 ns | 0.81 ns |
+| Method | Center | Spread |
+|:-------|-------:|-------:|
+| Foo | 31.0ns | 0.81ns |
+| Bar | 41.0ns | 0.81ns |
{
"engine": {
diff --git a/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default04.verified.txt b/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default04.verified.txt
index b9b8e6556f..a021bf7ce1 100644
--- a/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default04.verified.txt
+++ b/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default04.verified.txt
@@ -6,12 +6,12 @@ Type = Bench
@Net481LegacyJit: Runtime = Net481, Jit = LegacyJit
@Net70RyuJit: Runtime = Net70, Jit = RyuJit
-| Method | Job | Center | Spread |
-|:-------|:----------------|--------:|--------:|
-| Foo | Net481LegacyJit | 11.0 ns | 0.81 ns |
-| Bar | Net481LegacyJit | 21.0 ns | 0.81 ns |
-| Foo | Net70RyuJit | 31.0 ns | 0.81 ns |
-| Bar | Net70RyuJit | 41.0 ns | 0.81 ns |
+| Method | Job | Center | Spread |
+|:-------|:----------------|-------:|-------:|
+| Foo | Net481LegacyJit | 11.0ns | 0.81ns |
+| Bar | Net481LegacyJit | 21.0ns | 0.81ns |
+| Foo | Net70RyuJit | 31.0ns | 0.81ns |
+| Bar | Net70RyuJit | 41.0ns | 0.81ns |
{
"engine": {
diff --git a/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default05.verified.txt b/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default05.verified.txt
index 699a874b4e..d5d49c5ab8 100644
--- a/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default05.verified.txt
+++ b/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=default05.verified.txt
@@ -24,48 +24,48 @@ Type = Bench, Jit = RyuJit
@Net80Affinity18: Runtime = Net80, Affinity = 18
@Net90Affinity19: Runtime = Net90, Affinity = 19
-| Method | Job | Center | Spread |
-|:-------|:---------------------|----------:|--------:|
-| Foo | HostProcessAffinity0 | 2.00 ns | 0.81 ns |
-| Bar | HostProcessAffinity0 | 7.00 ns | 0.81 ns |
-| Foo | Squid | 12.00 ns | 0.81 ns |
-| Bar | Squid | 17.00 ns | 0.81 ns |
-| Foo | MonoAffinity2 | 22.00 ns | 0.81 ns |
-| Bar | MonoAffinity2 | 27.00 ns | 0.81 ns |
-| Foo | Net461Affinity3 | 32.00 ns | 0.81 ns |
-| Bar | Net461Affinity3 | 37.00 ns | 0.81 ns |
-| Foo | Net462Affinity4 | 42.00 ns | 0.81 ns |
-| Bar | Net462Affinity4 | 47.00 ns | 0.81 ns |
-| Foo | Net47Affinity5 | 52.00 ns | 0.81 ns |
-| Bar | Net47Affinity5 | 57.00 ns | 0.81 ns |
-| Foo | Net471Affinity6 | 62.00 ns | 0.81 ns |
-| Bar | Net471Affinity6 | 67.00 ns | 0.81 ns |
-| Foo | Net472Affinity7 | 72.00 ns | 0.81 ns |
-| Bar | Net472Affinity7 | 77.00 ns | 0.81 ns |
-| Foo | Net48Affinity8 | 82.00 ns | 0.81 ns |
-| Bar | Net48Affinity8 | 87.00 ns | 0.81 ns |
-| Foo | Net481Affinity9 | 92.00 ns | 0.81 ns |
-| Bar | Net481Affinity9 | 97.00 ns | 0.81 ns |
-| Foo | Liger | 102.00 ns | 0.81 ns |
-| Bar | Liger | 107.00 ns | 0.81 ns |
-| Foo | Rat | 112.00 ns | 0.81 ns |
-| Bar | Rat | 117.00 ns | 0.81 ns |
-| Foo | Skate | 122.00 ns | 0.81 ns |
-| Bar | Skate | 127.00 ns | 0.81 ns |
-| Foo | Perch | 132.00 ns | 0.81 ns |
-| Bar | Perch | 137.00 ns | 0.81 ns |
-| Foo | Roach | 142.00 ns | 0.81 ns |
-| Bar | Roach | 147.00 ns | 0.81 ns |
-| Foo | Net50Affinity15 | 152.00 ns | 0.81 ns |
-| Bar | Net50Affinity15 | 157.00 ns | 0.81 ns |
-| Foo | Net60Affinity16 | 162.00 ns | 0.81 ns |
-| Bar | Net60Affinity16 | 167.00 ns | 0.81 ns |
-| Foo | Net70Affinity17 | 172.00 ns | 0.81 ns |
-| Bar | Net70Affinity17 | 177.00 ns | 0.81 ns |
-| Foo | Net80Affinity18 | 182.00 ns | 0.81 ns |
-| Bar | Net80Affinity18 | 187.00 ns | 0.81 ns |
-| Foo | Net90Affinity19 | 192.00 ns | 0.81 ns |
-| Bar | Net90Affinity19 | 197.00 ns | 0.81 ns |
+| Method | Job | Center | Spread |
+|:-------|:---------------------|---------:|-------:|
+| Foo | HostProcessAffinity0 | 2.00ns | 0.81ns |
+| Bar | HostProcessAffinity0 | 7.00ns | 0.81ns |
+| Foo | Squid | 12.00ns | 0.81ns |
+| Bar | Squid | 17.00ns | 0.81ns |
+| Foo | MonoAffinity2 | 22.00ns | 0.81ns |
+| Bar | MonoAffinity2 | 27.00ns | 0.81ns |
+| Foo | Net461Affinity3 | 32.00ns | 0.81ns |
+| Bar | Net461Affinity3 | 37.00ns | 0.81ns |
+| Foo | Net462Affinity4 | 42.00ns | 0.81ns |
+| Bar | Net462Affinity4 | 47.00ns | 0.81ns |
+| Foo | Net47Affinity5 | 52.00ns | 0.81ns |
+| Bar | Net47Affinity5 | 57.00ns | 0.81ns |
+| Foo | Net471Affinity6 | 62.00ns | 0.81ns |
+| Bar | Net471Affinity6 | 67.00ns | 0.81ns |
+| Foo | Net472Affinity7 | 72.00ns | 0.81ns |
+| Bar | Net472Affinity7 | 77.00ns | 0.81ns |
+| Foo | Net48Affinity8 | 82.00ns | 0.81ns |
+| Bar | Net48Affinity8 | 87.00ns | 0.81ns |
+| Foo | Net481Affinity9 | 92.00ns | 0.81ns |
+| Bar | Net481Affinity9 | 97.00ns | 0.81ns |
+| Foo | Liger | 102.00ns | 0.81ns |
+| Bar | Liger | 107.00ns | 0.81ns |
+| Foo | Rat | 112.00ns | 0.81ns |
+| Bar | Rat | 117.00ns | 0.81ns |
+| Foo | Skate | 122.00ns | 0.81ns |
+| Bar | Skate | 127.00ns | 0.81ns |
+| Foo | Perch | 132.00ns | 0.81ns |
+| Bar | Perch | 137.00ns | 0.81ns |
+| Foo | Roach | 142.00ns | 0.81ns |
+| Bar | Roach | 147.00ns | 0.81ns |
+| Foo | Net50Affinity15 | 152.00ns | 0.81ns |
+| Bar | Net50Affinity15 | 157.00ns | 0.81ns |
+| Foo | Net60Affinity16 | 162.00ns | 0.81ns |
+| Bar | Net60Affinity16 | 167.00ns | 0.81ns |
+| Foo | Net70Affinity17 | 172.00ns | 0.81ns |
+| Bar | Net70Affinity17 | 177.00ns | 0.81ns |
+| Foo | Net80Affinity18 | 182.00ns | 0.81ns |
+| Bar | Net80Affinity18 | 187.00ns | 0.81ns |
+| Foo | Net90Affinity19 | 192.00ns | 0.81ns |
+| Bar | Net90Affinity19 | 197.00ns | 0.81ns |
{
"engine": {
diff --git a/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=params01.verified.txt b/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=params01.verified.txt
index f5f36bb3b7..c110ef22cc 100644
--- a/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=params01.verified.txt
+++ b/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=params01.verified.txt
@@ -1,7 +1,7 @@
-| Method | A | B | Center |
-|:-------|---:|---:|--------:|
-| Foo | 1 | 2 | 10.0 ms |
-| Bar | 10 | 20 | 20.0 ms |
+| Method | A | B | Center |
+|:-------|---:|---:|-------:|
+| Foo | 1 | 2 | 10.0ms |
+| Bar | 10 | 20 | 20.0ms |
{
"nested": [
diff --git a/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=sort01.verified.txt b/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=sort01.verified.txt
index 8c2956eb1a..c47fb9d2a6 100644
--- a/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=sort01.verified.txt
+++ b/tests/BenchmarkDotNet.Tests/Perfonar/VerifiedFiles/Perfonar.PerfonarTableTest_key=sort01.verified.txt
@@ -1,7 +1,7 @@
-| Method | Center |
-|:-------|--------:|
-| Bar | 20.0 ms |
-| Foo | 10.0 ms |
+| Method | Center |
+|:-------|-------:|
+| Bar | 20.0ms |
+| Foo | 10.0ms |
{
"nested": [