Skip to content

Commit

Permalink
Adding some basic Utf8Formatter/Utf8Parser perf tests covering decima…
Browse files Browse the repository at this point in the history
…l, double, and float (dotnet#33427)

* Adding some basic Utf8Formatter/Utf8Parser perf tests covering decimal, double, and float

* Changing the inner iteration count to use the `InnerCount` constant
  • Loading branch information
tannergooding authored and jlennox committed Dec 16, 2018
1 parent 6f9a49b commit 2f7b222
Show file tree
Hide file tree
Showing 2 changed files with 196 additions and 0 deletions.
99 changes: 99 additions & 0 deletions src/System.Memory/tests/Performance/Perf.Utf8Formatter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,105 @@ private static void FormatterUInt64(ulong value)
}
}

[Benchmark(InnerIterationCount = InnerCount)]
private static void FormatterDecimal()
{
decimal value = new decimal(1.23456789E+5);

byte[] utf8ByteArray = new byte[40];
Span<byte> utf8ByteSpan = utf8ByteArray;

foreach (BenchmarkIteration iteration in Benchmark.Iterations)
{
using (iteration.StartMeasurement())
{
for (int i = 0; i < Benchmark.InnerIterationCount; i++)
{
Utf8Formatter.TryFormat(value, utf8ByteSpan, out int bytesWritten);
TestHelpers.DoNotIgnore(value, bytesWritten);
}
}
}
}

// Reenable commented out test cases when https://github.com/xunit/xunit/issues/1822 is fixed.
[Benchmark(InnerIterationCount = InnerCount)]
[InlineData(double.NegativeInfinity)] // Negative Infinity
[InlineData(double.MinValue)] // Min Negative Normal
[InlineData(-3.14159265358979324)] // Negative pi
[InlineData(-2.71828182845904524)] // Negative e
[InlineData(-1.0)] // Negative One
// [InlineData(-2.2250738585072014E-308)] // Max Negative Normal
[InlineData(-2.2250738585072009E-308)] // Min Negative Subnormal
[InlineData(-double.Epsilon)] // Max Negative Subnormal (Negative Epsilon)
[InlineData(-0.0)] // Negative Zero
[InlineData(double.NaN)] // NaN
[InlineData(0.0)] // Positive Zero
[InlineData(double.Epsilon)] // Min Positive Subnormal (Positive Epsilon)
[InlineData(2.2250738585072009E-308)] // Max Positive Subnormal
// [InlineData(2.2250738585072014E-308)] // Min Positive Normal
[InlineData(1.0)] // Positive One
[InlineData(2.71828182845904524)] // Positive e
[InlineData(3.14159265358979324)] // Positive pi
[InlineData(double.MaxValue)] // Max Positive Normal
[InlineData(double.PositiveInfinity)] // Positive Infinity
private static void FormatterDouble(double value)
{
byte[] utf8ByteArray = new byte[40];
Span<byte> utf8ByteSpan = utf8ByteArray;

foreach (BenchmarkIteration iteration in Benchmark.Iterations)
{
using (iteration.StartMeasurement())
{
for (int i = 0; i < Benchmark.InnerIterationCount; i++)
{
Utf8Formatter.TryFormat(value, utf8ByteSpan, out int bytesWritten);
TestHelpers.DoNotIgnore(value, bytesWritten);
}
}
}
}

// Reenable commented out test cases when https://github.com/xunit/xunit/issues/1822 is fixed.
[Benchmark(InnerIterationCount = InnerCount)]
[InlineData(float.NegativeInfinity)] // Negative Infinity
[InlineData(float.MinValue)] // Min Negative Normal
[InlineData(-3.14159265f)] // Negative pi
[InlineData(-2.71828183f)] // Negative e
[InlineData(-1.0f)] // Negative One
// [InlineData(-1.17549435E-38f)] // Max Negative Normal
[InlineData(-1.17549421E-38f)] // Min Negative Subnormal
[InlineData(-float.Epsilon)] // Max Negative Subnormal (Negative Epsilon)
[InlineData(-0.0f)] // Negative Zero
[InlineData(float.NaN)] // NaN
[InlineData(0.0f)] // Positive Zero
[InlineData(float.Epsilon)] // Min Positive Subnormal (Positive Epsilon)
[InlineData(1.17549421E-38f)] // Max Positive Subnormal
// [InlineData(1.17549435E-38f)] // Min Positive Normal
[InlineData(1.0f)] // Positive One
[InlineData(2.71828183f)] // Positive e
[InlineData(3.14159265f)] // Positive pi
[InlineData(float.MaxValue)] // Max Positive Normal
[InlineData(float.PositiveInfinity)] // Positive Infinity
private static void FormatterSingle(float value)
{
byte[] utf8ByteArray = new byte[40];
Span<byte> utf8ByteSpan = utf8ByteArray;

foreach (BenchmarkIteration iteration in Benchmark.Iterations)
{
using (iteration.StartMeasurement())
{
for (int i = 0; i < Benchmark.InnerIterationCount; i++)
{
Utf8Formatter.TryFormat(value, utf8ByteSpan, out int bytesWritten);
TestHelpers.DoNotIgnore(value, bytesWritten);
}
}
}
}

[Benchmark(InnerIterationCount = InnerCount)]
private static void FormatterDateTimeOffsetNow()
{
Expand Down
97 changes: 97 additions & 0 deletions src/System.Memory/tests/Performance/Perf.Utf8Parser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -818,5 +818,102 @@ private static void StringToTimeOffsetR_Baseline(string text)
}
}
}

[Benchmark(InnerIterationCount = InnerCount)]
private static void ByteSpanToDecimal()
{
byte[] utf8ByteArray = Encoding.UTF8.GetBytes("1.23456789E+5");
ReadOnlySpan<byte> utf8ByteSpan = utf8ByteArray;

foreach (BenchmarkIteration iteration in Benchmark.Iterations)
{
using (iteration.StartMeasurement())
{
for (int i = 0; i < Benchmark.InnerIterationCount; i++)
{
Utf8Parser.TryParse(utf8ByteSpan, out decimal value, out int bytesConsumed);
TestHelpers.DoNotIgnore(value, bytesConsumed);
}
}
}
}

// Reenable commented out test cases when https://github.com/xunit/xunit/issues/1822 is fixed.
[Benchmark(InnerIterationCount = InnerCount)]
[InlineData("-Infinity")] // Negative Infinity
[InlineData("-1.7976931348623157E+308")] // Min Negative Normal
[InlineData("-3.1415926535897931")] // Negative pi
[InlineData("-2.7182818284590451")] // Negative e
[InlineData("-1")] // Negative One
// [InlineData("-2.2250738585072014E-308")] // Max Negative Normal
[InlineData("-2.2250738585072009E-308")] // Min Negative Subnormal
[InlineData("-4.94065645841247E-324")] // Max Negative Subnormal (Negative Epsilon)
[InlineData("-0.0")] // Negative Zero
[InlineData("NaN")] // NaN
[InlineData("0")] // Positive Zero
[InlineData("4.94065645841247E-324")] // Min Positive Subnormal (Positive Epsilon)
[InlineData("2.2250738585072009E-308")] // Max Positive Subnormal
// [InlineData("2.2250738585072014E-308")] // Min Positive Normal
[InlineData("1")] // Positive One
[InlineData("2.7182818284590451")] // Positive e
[InlineData("3.1415926535897931")] // Positive pi
[InlineData("1.7976931348623157E+308")] // Max Positive Normal
[InlineData("Infinity")] // Positive Infinity
private static void ByteSpanToDouble(string text)
{
byte[] utf8ByteArray = Encoding.UTF8.GetBytes(text);
ReadOnlySpan<byte> utf8ByteSpan = utf8ByteArray;

foreach (BenchmarkIteration iteration in Benchmark.Iterations)
{
using (iteration.StartMeasurement())
{
for (int i = 0; i < Benchmark.InnerIterationCount; i++)
{
Utf8Parser.TryParse(utf8ByteSpan, out double value, out int bytesConsumed);
TestHelpers.DoNotIgnore(value, bytesConsumed);
}
}
}
}

// Reenable commented out test cases when https://github.com/xunit/xunit/issues/1822 is fixed.
[Benchmark(InnerIterationCount = InnerCount)]
[InlineData("-Infinity")] // Negative Infinity
[InlineData("-3.40282347E+38")] // Min Negative Normal
[InlineData("-3.14159274")] // Negative pi
[InlineData("-2.71828175")] // Negative e
[InlineData("-1")] // Negative One
// [InlineData("-1.17549435E-38")] // Max Negative Normal
[InlineData("-1.17549421E-38")] // Min Negative Subnormal
[InlineData("-1.401298E-45")] // Max Negative Subnormal (Negative Epsilon)
[InlineData("-0.0")] // Negative Zero
[InlineData("NaN")] // NaN
[InlineData("0")] // Positive Zero
[InlineData("1.401298E-45")] // Min Positive Subnormal (Positive Epsilon)
[InlineData("1.17549421E-38")] // Max Positive Subnormal
// [InlineData("1.17549435E-38")] // Min Positive Normal
[InlineData("1")] // Positive One
[InlineData("2.71828175")] // Positive e
[InlineData("3.14159274")] // Positive pi
[InlineData("3.40282347E+38")] // Max Positive Normal
[InlineData("Infinity")] // Positive Infinity
private static void ByteSpanToSingle(string text)
{
byte[] utf8ByteArray = Encoding.UTF8.GetBytes(text);
ReadOnlySpan<byte> utf8ByteSpan = utf8ByteArray;

foreach (BenchmarkIteration iteration in Benchmark.Iterations)
{
using (iteration.StartMeasurement())
{
for (int i = 0; i < Benchmark.InnerIterationCount; i++)
{
Utf8Parser.TryParse(utf8ByteSpan, out float value, out int bytesConsumed);
TestHelpers.DoNotIgnore(value, bytesConsumed);
}
}
}
}
}
}

0 comments on commit 2f7b222

Please sign in to comment.