[Perf] Display results with 4 significant figures (#3770)

- Fixes #3554
This commit is contained in:
Mike Harder 2022-07-29 12:26:12 -07:00 коммит произвёл GitHub
Родитель abe40152d9
Коммит 3b9baf4a14
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
3 изменённых файлов: 113 добавлений и 1 удалений

Просмотреть файл

@ -0,0 +1,70 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
using NUnit.Framework;
using System;
namespace Azure.Sdk.Tools.PerfAutomation.Tests
{
public class NumberFormatterTests
{
// Standard Tests
[TestCase(0.00012345, 1, "0.0001")]
[TestCase(0.00012345, 2, "0.00012")]
[TestCase(0.00012345, 3, "0.000123")]
[TestCase(0.00012345, 4, "0.0001235")]
[TestCase(0.00012345, 5, "0.00012345")]
[TestCase(0.00012345, 6, "0.000123450")]
[TestCase(0.00012345, 7, "0.0001234500")]
[TestCase(1.2345, 1, "1")]
[TestCase(1.2345, 2, "1.2")]
[TestCase(1.2345, 3, "1.23")]
[TestCase(1.2345, 4, "1.235")]
[TestCase(1.2345, 5, "1.2345")]
[TestCase(1.2345, 6, "1.23450")]
[TestCase(1.2345, 7, "1.234500")]
[TestCase(12_345, 1, "12,345")]
[TestCase(12_345, 2, "12,345")]
[TestCase(12_345, 3, "12,345")]
[TestCase(12_345, 4, "12,345")]
[TestCase(12_345, 5, "12,345")]
[TestCase(12_345, 6, "12,345.0")]
[TestCase(12_345, 7, "12,345.00")]
// Group separator
[TestCase(12_345, 1, "12345", false)]
[TestCase(12_345, 2, "12345", false)]
[TestCase(12_345, 3, "12345", false)]
[TestCase(12_345, 4, "12345", false)]
[TestCase(12_345, 5, "12345", false)]
[TestCase(12_345, 6, "12345.0", false)]
[TestCase(12_345, 7, "12345.00", false)]
// Bug where fractional part of log10 was > 0.5
[TestCase(8.22929639076288, 4, "8.229")]
// Zero
[TestCase(0, 1, "0")]
[TestCase(0, 2, "0.0")]
[TestCase(0, 3, "0.00")]
[TestCase(0, 4, "0.000")]
// Negative numbers
[TestCase(-1, 1, "-1")]
[TestCase(-1, 4, "-1.000")]
[TestCase(-0.00012345, 4, "-0.0001235")]
[TestCase(-1.2345, 4, "-1.235")]
[TestCase(-12_345, 4, "-12,345")]
public void Format(double value, int minSignificantDigits, string expected, bool groupSeparator = true)
{
Assert.AreEqual(expected, NumberFormatter.Format(value, minSignificantDigits, groupSeparator));
}
[TestCase(1.2345, 0, typeof(ArgumentException))]
[TestCase(1.2345, -1, typeof(ArgumentException))]
public void FormatException(double value, int minSignificantDigits, Type expectedExceptionType)
{
Assert.Throws(expectedExceptionType, () => NumberFormatter.Format(value, minSignificantDigits));
}
}
}

Просмотреть файл

@ -0,0 +1,41 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
using System;
namespace Azure.Sdk.Tools.PerfAutomation
{
public static class NumberFormatter
{
// Formats a number with a minimum number of significant digits.
// Digits to the left of the decimal point are always significant.
// Examples:
// - Format(0, 4) -> "0.000"
// - Format(12345, 4) -> "12,345"
// - Format(1.2345, 4) -> "1.235"
// - Format(0.00012345, 4) -> "0.0001235"
public static string Format(double value, int minSignificantDigits, bool groupSeparator = true)
{
if (minSignificantDigits <= 0)
{
throw new ArgumentException("Must be greater than zero", nameof(minSignificantDigits));
}
// Special case since log(0) is undefined
if (value == 0)
{
return value.ToString($"F{minSignificantDigits - 1}");
}
double log = Math.Log10(Math.Abs(value));
int significantDigits = (int)Math.Max(Math.Ceiling(log), minSignificantDigits);
double divisor = Math.Pow(10, Math.Ceiling(log) - significantDigits);
double rounded = divisor * Math.Round(value / divisor, MidpointRounding.AwayFromZero);
int decimals = (int)Math.Max(0, significantDigits - Math.Floor(log) - 1);
return rounded.ToString(groupSeparator ? $"N{decimals}" : $"F{decimals}");
}
}
}

Просмотреть файл

@ -552,7 +552,8 @@ namespace Azure.Sdk.Tools.PerfAutomation
row.Add(resultSummary.Test);
row.Add(resultSummary.Arguments);
var operationsPerSecondStrings = operationsPerSecond(resultSummary).Select(o => $"{o.operationsPerSecond:F2}");
var operationsPerSecondStrings = operationsPerSecond(resultSummary)
.Select(o => $"{NumberFormatter.Format(o.operationsPerSecond, 4, groupSeparator: outputFormat != OutputFormat.Csv)}");
var operationsPerSecondDifferencesStrings = operationsPerSecondDifferences(resultSummary).Select(o => $"{o * 100:N2}%");
var values = operationsPerSecondStrings.Take(1).Concat(operationsPerSecondStrings.Skip(1)