From e9f8f00e95f42faa525f0037f82a61d8b6fcae2f Mon Sep 17 00:00:00 2001 From: Eirik Tsarpalis Date: Thu, 18 Nov 2021 16:53:58 +0000 Subject: [PATCH 1/2] add Utf8JsonReader.GetBoolean() benchmark --- .../Utf8JsonReader/Perf.Get.cs | 169 ++++++++---------- 1 file changed, 73 insertions(+), 96 deletions(-) diff --git a/src/benchmarks/micro/libraries/System.Text.Json/Utf8JsonReader/Perf.Get.cs b/src/benchmarks/micro/libraries/System.Text.Json/Utf8JsonReader/Perf.Get.cs index bf816c5bf57..ed0e032f935 100644 --- a/src/benchmarks/micro/libraries/System.Text.Json/Utf8JsonReader/Perf.Get.cs +++ b/src/benchmarks/micro/libraries/System.Text.Json/Utf8JsonReader/Perf.Get.cs @@ -4,13 +4,15 @@ using BenchmarkDotNet.Attributes; using MicroBenchmarks; -using System.Linq; namespace System.Text.Json.Tests { [BenchmarkCategory(Categories.Libraries, Categories.JSON)] public class Perf_Get { + private const int OperationsPerBenchmark = 100; + + private static readonly byte[] _jsonFalseBytes = GetJsonBytes("false"); private static readonly byte[] _jsonIntegerNumberBytes = GetJsonBytes(123); private static readonly byte[] _jsonDecimalNumberBytes = GetJsonBytes(123.456f); private static readonly byte[] _jsonStringBytes = GetJsonBytes("\"The quick brown fox jumps over the lazy dog.\""); @@ -23,214 +25,189 @@ private static byte[] GetJsonBytes(T elem) return Encoding.UTF8.GetBytes(elem.ToString()); } - [Benchmark] - public byte GetByte() + [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] + public void GetBoolean() { - byte result = 0; - var reader = new Utf8JsonReader(_jsonIntegerNumberBytes); + var reader = new Utf8JsonReader(_jsonFalseBytes); reader.Read(); - for (int i = 0; i < 100; i++) + for (int i = 0; i < OperationsPerBenchmark; i++) { - result += reader.GetByte(); + reader.GetBoolean(); } - return result; } - [Benchmark] - public sbyte GetSByte() + [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] + public void GetByte() { - sbyte result = 0; var reader = new Utf8JsonReader(_jsonIntegerNumberBytes); reader.Read(); - for (int i = 0; i < 100; i++) + for (int i = 0; i < OperationsPerBenchmark; i++) { - result += reader.GetSByte(); + reader.GetByte(); } - return result; } - [Benchmark] - public short GetInt16() + [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] + public void GetSByte() { - short result = 0; var reader = new Utf8JsonReader(_jsonIntegerNumberBytes); reader.Read(); - for (int i = 0; i < 100; i++) + for (int i = 0; i < OperationsPerBenchmark; i++) { - result += reader.GetInt16(); + reader.GetSByte(); } - return result; } - [Benchmark] - public int GetInt32() + [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] + public void GetInt16() { - int result = 0; var reader = new Utf8JsonReader(_jsonIntegerNumberBytes); reader.Read(); - for (int i = 0; i < 100; i++) + for (int i = 0; i < OperationsPerBenchmark; i++) { - result += reader.GetInt32(); + reader.GetInt16(); } - return result; } - [Benchmark] - public long GetInt64() + [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] + public void GetInt32() { - long result = 0; var reader = new Utf8JsonReader(_jsonIntegerNumberBytes); reader.Read(); - - for (int i = 0; i < 100; i++) + for (int i = 0; i < OperationsPerBenchmark; i++) { - result += reader.GetInt64(); + reader.GetInt32(); } - return result; } - [Benchmark] - public ushort GetUInt16() + [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] + public void GetInt64() { - ushort result = 0; var reader = new Utf8JsonReader(_jsonIntegerNumberBytes); reader.Read(); - - for (int i = 0; i < 100; i++) + for (int i = 0; i < OperationsPerBenchmark; i++) { - result += reader.GetUInt16(); + reader.GetInt64(); } - return result; } - [Benchmark] - public uint GetUInt32() + [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] + public void GetUInt16() { - uint result = 0; var reader = new Utf8JsonReader(_jsonIntegerNumberBytes); reader.Read(); - for (int i = 0; i < 100; i++) { - result += reader.GetUInt32(); + reader.GetUInt16(); } - return result; } - [Benchmark] - public ulong GetUInt64() + [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] + public void GetUInt32() { - ulong result = 0; var reader = new Utf8JsonReader(_jsonIntegerNumberBytes); reader.Read(); + for (int i = 0; i < OperationsPerBenchmark; i++) + { + reader.GetUInt32(); + } + } - for (int i = 0; i < 100; i++) + [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] + public void GetUInt64() + { + var reader = new Utf8JsonReader(_jsonIntegerNumberBytes); + reader.Read(); + for (int i = 0; i < OperationsPerBenchmark; i++) { - result += reader.GetUInt64(); + reader.GetUInt64(); } - return result; } - [Benchmark] - public float GetSingle() + [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] + public void GetSingle() { - float result = 0; var reader = new Utf8JsonReader(_jsonDecimalNumberBytes); reader.Read(); - for (int i = 0; i < 100; i++) + for (int i = 0; i < OperationsPerBenchmark; i++) { - result += reader.GetSingle(); + reader.GetSingle(); } - return result; } - [Benchmark] - public double GetDouble() + [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] + public void GetDouble() { - double result = 0; var reader = new Utf8JsonReader(_jsonDecimalNumberBytes); reader.Read(); - - for (int i = 0; i < 100; i++) + for (int i = 0; i < OperationsPerBenchmark; i++) { - result += reader.GetDouble(); + reader.GetDouble(); } - return result; } - [Benchmark] - public decimal GetDecimal() + [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] + public void GetDecimal() { - decimal result = 0; var reader = new Utf8JsonReader(_jsonDecimalNumberBytes); reader.Read(); - - for (int i = 0; i < 100; i++) + for (int i = 0; i < OperationsPerBenchmark; i++) { - result += reader.GetDecimal(); + reader.GetDecimal(); } - return result; } - [Benchmark] - public DateTime GetDateTime() + [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] + public void GetDateTime() { - DateTime result = default; var reader = new Utf8JsonReader(_jsonDateTimeBytes); reader.Read(); - for (int i = 0; i < 100; i++) + for (int i = 0; i < OperationsPerBenchmark; i++) { - result = reader.GetDateTime(); + reader.GetDateTime(); } - return result; } - [Benchmark] - public DateTimeOffset GetDateTimeOffset() + [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] + public void GetDateTimeOffset() { - DateTimeOffset result = default; var reader = new Utf8JsonReader(_jsonDateTimeOffsetBytes); reader.Read(); - for (int i = 0; i < 100; i++) + for (int i = 0; i < OperationsPerBenchmark; i++) { - result = reader.GetDateTimeOffset(); + reader.GetDateTimeOffset(); } - return result; } - [Benchmark] - public Guid GetGuid() + [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] + public void GetGuid() { - Guid result = default; var reader = new Utf8JsonReader(_jsonGuidBytes); reader.Read(); - for (int i = 0; i < 100; i++) + for (int i = 0; i < OperationsPerBenchmark; i++) { - result = reader.GetGuid(); + reader.GetGuid(); } - return result; } - [Benchmark] - public string GetString() + [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] + public void GetString() { - string result = default; var reader = new Utf8JsonReader(_jsonStringBytes); reader.Read(); - for (int i = 0; i < 100; i++) + for (int i = 0; i < OperationsPerBenchmark; i++) { - result = reader.GetString(); + reader.GetString(); } - return result; } } } From aa789c9152f8d8d23ccaf3bcd0a9d129dfce26d4 Mon Sep 17 00:00:00 2001 From: Eirik Tsarpalis Date: Fri, 19 Nov 2021 10:00:59 +0000 Subject: [PATCH 2/2] address feedback --- .../Utf8JsonReader/Perf.Get.cs | 169 +++++++++++------- 1 file changed, 104 insertions(+), 65 deletions(-) diff --git a/src/benchmarks/micro/libraries/System.Text.Json/Utf8JsonReader/Perf.Get.cs b/src/benchmarks/micro/libraries/System.Text.Json/Utf8JsonReader/Perf.Get.cs index ed0e032f935..70a47249a15 100644 --- a/src/benchmarks/micro/libraries/System.Text.Json/Utf8JsonReader/Perf.Get.cs +++ b/src/benchmarks/micro/libraries/System.Text.Json/Utf8JsonReader/Perf.Get.cs @@ -4,14 +4,13 @@ using BenchmarkDotNet.Attributes; using MicroBenchmarks; +using System.Linq; namespace System.Text.Json.Tests { [BenchmarkCategory(Categories.Libraries, Categories.JSON)] public class Perf_Get { - private const int OperationsPerBenchmark = 100; - private static readonly byte[] _jsonFalseBytes = GetJsonBytes("false"); private static readonly byte[] _jsonIntegerNumberBytes = GetJsonBytes(123); private static readonly byte[] _jsonDecimalNumberBytes = GetJsonBytes(123.456f); @@ -25,189 +24,229 @@ private static byte[] GetJsonBytes(T elem) return Encoding.UTF8.GetBytes(elem.ToString()); } - [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] - public void GetBoolean() + [Benchmark] + public bool GetBoolean() { + bool result = false; var reader = new Utf8JsonReader(_jsonFalseBytes); reader.Read(); - for (int i = 0; i < OperationsPerBenchmark; i++) + for (int i = 0; i < 100; i++) { - reader.GetBoolean(); + result ^= reader.GetBoolean(); } + + return result; } - [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] - public void GetByte() + [Benchmark] + public byte GetByte() { + byte result = 0; var reader = new Utf8JsonReader(_jsonIntegerNumberBytes); reader.Read(); - for (int i = 0; i < OperationsPerBenchmark; i++) + for (int i = 0; i < 100; i++) { - reader.GetByte(); + result += reader.GetByte(); } + return result; } - [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] - public void GetSByte() + [Benchmark] + public sbyte GetSByte() { + sbyte result = 0; var reader = new Utf8JsonReader(_jsonIntegerNumberBytes); reader.Read(); - for (int i = 0; i < OperationsPerBenchmark; i++) + for (int i = 0; i < 100; i++) { - reader.GetSByte(); + result += reader.GetSByte(); } + return result; } - [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] - public void GetInt16() + [Benchmark] + public short GetInt16() { + short result = 0; var reader = new Utf8JsonReader(_jsonIntegerNumberBytes); reader.Read(); - for (int i = 0; i < OperationsPerBenchmark; i++) + for (int i = 0; i < 100; i++) { - reader.GetInt16(); + result += reader.GetInt16(); } + return result; } - [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] - public void GetInt32() + [Benchmark] + public int GetInt32() { + int result = 0; var reader = new Utf8JsonReader(_jsonIntegerNumberBytes); reader.Read(); - for (int i = 0; i < OperationsPerBenchmark; i++) + + for (int i = 0; i < 100; i++) { - reader.GetInt32(); + result += reader.GetInt32(); } + return result; } - [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] - public void GetInt64() + [Benchmark] + public long GetInt64() { + long result = 0; var reader = new Utf8JsonReader(_jsonIntegerNumberBytes); reader.Read(); - for (int i = 0; i < OperationsPerBenchmark; i++) + + for (int i = 0; i < 100; i++) { - reader.GetInt64(); + result += reader.GetInt64(); } + return result; } - [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] - public void GetUInt16() + [Benchmark] + public ushort GetUInt16() { + ushort result = 0; var reader = new Utf8JsonReader(_jsonIntegerNumberBytes); reader.Read(); + for (int i = 0; i < 100; i++) { - reader.GetUInt16(); + result += reader.GetUInt16(); } + return result; } - [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] - public void GetUInt32() + [Benchmark] + public uint GetUInt32() { + uint result = 0; var reader = new Utf8JsonReader(_jsonIntegerNumberBytes); reader.Read(); - for (int i = 0; i < OperationsPerBenchmark; i++) + + for (int i = 0; i < 100; i++) { - reader.GetUInt32(); + result += reader.GetUInt32(); } + return result; } - [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] - public void GetUInt64() + [Benchmark] + public ulong GetUInt64() { + ulong result = 0; var reader = new Utf8JsonReader(_jsonIntegerNumberBytes); reader.Read(); - for (int i = 0; i < OperationsPerBenchmark; i++) + + for (int i = 0; i < 100; i++) { - reader.GetUInt64(); + result += reader.GetUInt64(); } + return result; } - [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] - public void GetSingle() + [Benchmark] + public float GetSingle() { + float result = 0; var reader = new Utf8JsonReader(_jsonDecimalNumberBytes); reader.Read(); - for (int i = 0; i < OperationsPerBenchmark; i++) + for (int i = 0; i < 100; i++) { - reader.GetSingle(); + result += reader.GetSingle(); } + return result; } - [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] - public void GetDouble() + [Benchmark] + public double GetDouble() { + double result = 0; var reader = new Utf8JsonReader(_jsonDecimalNumberBytes); reader.Read(); - for (int i = 0; i < OperationsPerBenchmark; i++) + + for (int i = 0; i < 100; i++) { - reader.GetDouble(); + result += reader.GetDouble(); } + return result; } - [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] - public void GetDecimal() + [Benchmark] + public decimal GetDecimal() { + decimal result = 0; var reader = new Utf8JsonReader(_jsonDecimalNumberBytes); reader.Read(); - for (int i = 0; i < OperationsPerBenchmark; i++) + + for (int i = 0; i < 100; i++) { - reader.GetDecimal(); + result += reader.GetDecimal(); } + return result; } - [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] - public void GetDateTime() + [Benchmark] + public DateTime GetDateTime() { + DateTime result = default; var reader = new Utf8JsonReader(_jsonDateTimeBytes); reader.Read(); - for (int i = 0; i < OperationsPerBenchmark; i++) + for (int i = 0; i < 100; i++) { - reader.GetDateTime(); + result = reader.GetDateTime(); } + return result; } - [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] - public void GetDateTimeOffset() + [Benchmark] + public DateTimeOffset GetDateTimeOffset() { + DateTimeOffset result = default; var reader = new Utf8JsonReader(_jsonDateTimeOffsetBytes); reader.Read(); - for (int i = 0; i < OperationsPerBenchmark; i++) + for (int i = 0; i < 100; i++) { - reader.GetDateTimeOffset(); + result = reader.GetDateTimeOffset(); } + return result; } - [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] - public void GetGuid() + [Benchmark] + public Guid GetGuid() { + Guid result = default; var reader = new Utf8JsonReader(_jsonGuidBytes); reader.Read(); - for (int i = 0; i < OperationsPerBenchmark; i++) + for (int i = 0; i < 100; i++) { - reader.GetGuid(); + result = reader.GetGuid(); } + return result; } - [Benchmark(OperationsPerInvoke = OperationsPerBenchmark)] - public void GetString() + [Benchmark] + public string GetString() { + string result = default; var reader = new Utf8JsonReader(_jsonStringBytes); reader.Read(); - for (int i = 0; i < OperationsPerBenchmark; i++) + for (int i = 0; i < 100; i++) { - reader.GetString(); + result = reader.GetString(); } + return result; } } }