diff --git a/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report-github.md b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report-github.md new file mode 100644 index 00000000..a044b6c7 --- /dev/null +++ b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report-github.md @@ -0,0 +1,18 @@ +``` + +BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley) +Unknown processor +.NET SDK 9.0.304 + [Host] : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI + DefaultJob : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI + + +``` +| Method | Mean | Error | StdDev | Gen0 | Gen1 | Allocated | +|------------------ |-----------:|----------:|----------:|-------:|-------:|----------:| +| STJ_String_Small | 287.1 ns | 3.48 ns | 3.25 ns | 0.0448 | - | 752 B | +| STJ_Bytes_Small | 247.2 ns | 2.79 ns | 2.18 ns | 0.0448 | - | 752 B | +| STJ_String_Medium | 499.8 ns | 8.72 ns | 6.81 ns | 0.2584 | 0.0038 | 4336 B | +| STJ_Bytes_Medium | 512.3 ns | 13.51 ns | 38.77 ns | 0.2589 | 0.0038 | 4336 B | +| STJ_String_Large | 4,610.5 ns | 114.34 ns | 337.12 ns | 3.9215 | 0.7782 | 65776 B | +| STJ_Bytes_Large | 3,421.0 ns | 72.74 ns | 208.71 ns | 3.9215 | 0.7820 | 65776 B | diff --git a/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report.csv b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report.csv new file mode 100644 index 00000000..b8456939 --- /dev/null +++ b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report.csv @@ -0,0 +1,7 @@ +Method;Job;AnalyzeLaunchVariance;EvaluateOverhead;MaxAbsoluteError;MaxRelativeError;MinInvokeCount;MinIterationTime;OutlierMode;Affinity;EnvironmentVariables;Jit;LargeAddressAware;Platform;PowerPlanMode;Runtime;AllowVeryLargeObjects;Concurrent;CpuGroups;Force;HeapAffinitizeMask;HeapCount;NoAffinitize;RetainVm;Server;Arguments;BuildConfiguration;Clock;EngineFactory;NuGetReferences;Toolchain;IsMutator;InvocationCount;IterationCount;IterationTime;LaunchCount;MaxIterationCount;MaxWarmupIterationCount;MemoryRandomization;MinIterationCount;MinWarmupIterationCount;RunStrategy;UnrollFactor;WarmupCount;Mean;Error;StdDev;Gen0;Gen1;Allocated +STJ_String_Small;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;287.1 ns;3.48 ns;3.25 ns;0.0448;0.0000;752 B +STJ_Bytes_Small;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;247.2 ns;2.79 ns;2.18 ns;0.0448;0.0000;752 B +STJ_String_Medium;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;499.8 ns;8.72 ns;6.81 ns;0.2584;0.0038;4336 B +STJ_Bytes_Medium;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;512.3 ns;13.51 ns;38.77 ns;0.2589;0.0038;4336 B +STJ_String_Large;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;"4,610.5 ns";114.34 ns;337.12 ns;3.9215;0.7782;65776 B +STJ_Bytes_Large;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;"3,421.0 ns";72.74 ns;208.71 ns;3.9215;0.7820;65776 B diff --git a/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report.html b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report.html new file mode 100644 index 00000000..04156a83 --- /dev/null +++ b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report.html @@ -0,0 +1,35 @@ + + + + +DSInternals.Json.Benchmarks.JsonDecodeBench-20250816-222213 + + + + +

+BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley)
+Unknown processor
+.NET SDK 9.0.304
+  [Host]     : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+  DefaultJob : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+
+
+ + + + + + + + + + +
Method MeanErrorStdDevGen0Gen1Allocated
STJ_String_Small287.1 ns3.48 ns3.25 ns0.0448-752 B
STJ_Bytes_Small247.2 ns2.79 ns2.18 ns0.0448-752 B
STJ_String_Medium499.8 ns8.72 ns6.81 ns0.25840.00384336 B
STJ_Bytes_Medium512.3 ns13.51 ns38.77 ns0.25890.00384336 B
STJ_String_Large4,610.5 ns114.34 ns337.12 ns3.92150.778265776 B
STJ_Bytes_Large3,421.0 ns72.74 ns208.71 ns3.92150.782065776 B
+ + diff --git a/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report-github.md b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report-github.md new file mode 100644 index 00000000..e4ef3e56 --- /dev/null +++ b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report-github.md @@ -0,0 +1,15 @@ +``` + +BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley) +Unknown processor +.NET SDK 9.0.304 + [Host] : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI + DefaultJob : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI + + +``` +| Method | Mean | Error | StdDev | Gen0 | Allocated | +|----------------- |---------:|--------:|---------:|-------:|----------:| +| Laps_String | 222.4 ns | 5.39 ns | 15.63 ns | 0.0124 | 208 B | +| Laps_Utf8_Bytes | 195.4 ns | 5.11 ns | 15.05 ns | 0.0124 | 208 B | +| Laps_Utf16_Bytes | 318.1 ns | 7.64 ns | 22.16 ns | 0.0381 | 640 B | diff --git a/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report.csv b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report.csv new file mode 100644 index 00000000..7665d8d5 --- /dev/null +++ b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report.csv @@ -0,0 +1,4 @@ +Method;Job;AnalyzeLaunchVariance;EvaluateOverhead;MaxAbsoluteError;MaxRelativeError;MinInvokeCount;MinIterationTime;OutlierMode;Affinity;EnvironmentVariables;Jit;LargeAddressAware;Platform;PowerPlanMode;Runtime;AllowVeryLargeObjects;Concurrent;CpuGroups;Force;HeapAffinitizeMask;HeapCount;NoAffinitize;RetainVm;Server;Arguments;BuildConfiguration;Clock;EngineFactory;NuGetReferences;Toolchain;IsMutator;InvocationCount;IterationCount;IterationTime;LaunchCount;MaxIterationCount;MaxWarmupIterationCount;MemoryRandomization;MinIterationCount;MinWarmupIterationCount;RunStrategy;UnrollFactor;WarmupCount;Mean;Error;StdDev;Gen0;Allocated +Laps_String;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;222.4 ns;5.39 ns;15.63 ns;0.0124;208 B +Laps_Utf8_Bytes;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;195.4 ns;5.11 ns;15.05 ns;0.0124;208 B +Laps_Utf16_Bytes;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;318.1 ns;7.64 ns;22.16 ns;0.0381;640 B diff --git a/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report.html b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report.html new file mode 100644 index 00000000..553d9196 --- /dev/null +++ b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report.html @@ -0,0 +1,32 @@ + + + + +DSInternals.Json.Benchmarks.LapsBench-20250816-222715 + + + + +

+BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley)
+Unknown processor
+.NET SDK 9.0.304
+  [Host]     : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+  DefaultJob : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+
+
+ + + + + + + +
Method MeanErrorStdDevGen0Allocated
Laps_String222.4 ns5.39 ns15.63 ns0.0124208 B
Laps_Utf8_Bytes195.4 ns5.11 ns15.05 ns0.0124208 B
Laps_Utf16_Bytes318.1 ns7.64 ns22.16 ns0.0381640 B
+ + diff --git a/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report-github.md b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report-github.md new file mode 100644 index 00000000..425b1713 --- /dev/null +++ b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report-github.md @@ -0,0 +1,18 @@ +``` + +BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley) +Unknown processor +.NET SDK 9.0.304 + [Host] : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI + DefaultJob : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI + + +``` +| Method | Mean | Error | StdDev | Median | Gen0 | Gen1 | Gen2 | Allocated | +|------------------ |------------:|----------:|------------:|------------:|--------:|--------:|--------:|----------:| +| STJ_String_Small | 279.8 ns | 4.15 ns | 3.88 ns | 279.0 ns | 0.0448 | - | - | 752 B | +| STJ_Bytes_Small | 342.9 ns | 6.37 ns | 5.96 ns | 342.5 ns | 0.1063 | 0.0005 | - | 1784 B | +| STJ_String_Medium | 631.9 ns | 28.32 ns | 83.50 ns | 649.3 ns | 0.2584 | 0.0038 | - | 4336 B | +| STJ_Bytes_Medium | 777.3 ns | 16.94 ns | 48.33 ns | 763.0 ns | 0.7496 | 0.0334 | - | 12536 B | +| STJ_String_Large | 4,043.0 ns | 66.74 ns | 52.11 ns | 4,041.0 ns | 3.9215 | 0.7782 | - | 65776 B | +| STJ_Bytes_Large | 36,013.7 ns | 743.78 ns | 2,193.05 ns | 35,435.2 ns | 41.6565 | 41.6565 | 41.6565 | 196884 B | diff --git a/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report.csv b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report.csv new file mode 100644 index 00000000..6d0c774c --- /dev/null +++ b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report.csv @@ -0,0 +1,7 @@ +Method;Job;AnalyzeLaunchVariance;EvaluateOverhead;MaxAbsoluteError;MaxRelativeError;MinInvokeCount;MinIterationTime;OutlierMode;Affinity;EnvironmentVariables;Jit;LargeAddressAware;Platform;PowerPlanMode;Runtime;AllowVeryLargeObjects;Concurrent;CpuGroups;Force;HeapAffinitizeMask;HeapCount;NoAffinitize;RetainVm;Server;Arguments;BuildConfiguration;Clock;EngineFactory;NuGetReferences;Toolchain;IsMutator;InvocationCount;IterationCount;IterationTime;LaunchCount;MaxIterationCount;MaxWarmupIterationCount;MemoryRandomization;MinIterationCount;MinWarmupIterationCount;RunStrategy;UnrollFactor;WarmupCount;Mean;Error;StdDev;Median;Gen0;Gen1;Gen2;Allocated +STJ_String_Small;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;279.8 ns;4.15 ns;3.88 ns;279.0 ns;0.0448;0.0000;0.0000;752 B +STJ_Bytes_Small;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;342.9 ns;6.37 ns;5.96 ns;342.5 ns;0.1063;0.0005;0.0000;1784 B +STJ_String_Medium;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;631.9 ns;28.32 ns;83.50 ns;649.3 ns;0.2584;0.0038;0.0000;4336 B +STJ_Bytes_Medium;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;777.3 ns;16.94 ns;48.33 ns;763.0 ns;0.7496;0.0334;0.0000;12536 B +STJ_String_Large;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;"4,043.0 ns";66.74 ns;52.11 ns;"4,041.0 ns";3.9215;0.7782;0.0000;65776 B +STJ_Bytes_Large;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;"36,013.7 ns";743.78 ns;"2,193.05 ns";"35,435.2 ns";41.6565;41.6565;41.6565;196884 B diff --git a/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report.html b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report.html new file mode 100644 index 00000000..b7dc2bf1 --- /dev/null +++ b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report.html @@ -0,0 +1,35 @@ + + + + +DSInternals.Json.Benchmarks.JsonDecodeBench-20250817-075533 + + + + +

+BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley)
+Unknown processor
+.NET SDK 9.0.304
+  [Host]     : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+  DefaultJob : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+
+
+ + + + + + + + + + +
Method Mean ErrorStdDevMedianGen0Gen1Gen2Allocated
STJ_String_Small279.8 ns4.15 ns3.88 ns279.0 ns0.0448--752 B
STJ_Bytes_Small342.9 ns6.37 ns5.96 ns342.5 ns0.10630.0005-1784 B
STJ_String_Medium631.9 ns28.32 ns83.50 ns649.3 ns0.25840.0038-4336 B
STJ_Bytes_Medium777.3 ns16.94 ns48.33 ns763.0 ns0.74960.0334-12536 B
STJ_String_Large4,043.0 ns66.74 ns52.11 ns4,041.0 ns3.92150.7782-65776 B
STJ_Bytes_Large36,013.7 ns743.78 ns2,193.05 ns35,435.2 ns41.656541.656541.6565196884 B
+ + diff --git a/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report-github.md b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report-github.md new file mode 100644 index 00000000..bd13de4e --- /dev/null +++ b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report-github.md @@ -0,0 +1,15 @@ +``` + +BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley) +Unknown processor +.NET SDK 9.0.304 + [Host] : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI + DefaultJob : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI + + +``` +| Method | Mean | Error | StdDev | Gen0 | Allocated | +|----------------- |---------:|--------:|---------:|-------:|----------:| +| Laps_String | 246.7 ns | 6.61 ns | 18.96 ns | 0.0124 | 208 B | +| Laps_Utf8_Bytes | 259.3 ns | 6.84 ns | 20.16 ns | 0.0219 | 368 B | +| Laps_Utf16_Bytes | 281.1 ns | 8.17 ns | 24.08 ns | 0.0219 | 368 B | diff --git a/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report.csv b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report.csv new file mode 100644 index 00000000..28101576 --- /dev/null +++ b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report.csv @@ -0,0 +1,4 @@ +Method;Job;AnalyzeLaunchVariance;EvaluateOverhead;MaxAbsoluteError;MaxRelativeError;MinInvokeCount;MinIterationTime;OutlierMode;Affinity;EnvironmentVariables;Jit;LargeAddressAware;Platform;PowerPlanMode;Runtime;AllowVeryLargeObjects;Concurrent;CpuGroups;Force;HeapAffinitizeMask;HeapCount;NoAffinitize;RetainVm;Server;Arguments;BuildConfiguration;Clock;EngineFactory;NuGetReferences;Toolchain;IsMutator;InvocationCount;IterationCount;IterationTime;LaunchCount;MaxIterationCount;MaxWarmupIterationCount;MemoryRandomization;MinIterationCount;MinWarmupIterationCount;RunStrategy;UnrollFactor;WarmupCount;Mean;Error;StdDev;Gen0;Allocated +Laps_String;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;246.7 ns;6.61 ns;18.96 ns;0.0124;208 B +Laps_Utf8_Bytes;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;259.3 ns;6.84 ns;20.16 ns;0.0219;368 B +Laps_Utf16_Bytes;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;281.1 ns;8.17 ns;24.08 ns;0.0219;368 B diff --git a/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report.html b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report.html new file mode 100644 index 00000000..fda92802 --- /dev/null +++ b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report.html @@ -0,0 +1,32 @@ + + + + +DSInternals.Json.Benchmarks.LapsBench-20250817-080046 + + + + +

+BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley)
+Unknown processor
+.NET SDK 9.0.304
+  [Host]     : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+  DefaultJob : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+
+
+ + + + + + + +
Method MeanErrorStdDevGen0Allocated
Laps_String246.7 ns6.61 ns18.96 ns0.0124208 B
Laps_Utf8_Bytes259.3 ns6.84 ns20.16 ns0.0219368 B
Laps_Utf16_Bytes281.1 ns8.17 ns24.08 ns0.0219368 B
+ + diff --git a/Src/DSInternals.Common/Serialization/DsiJson.cs b/Src/DSInternals.Common/Serialization/DsiJson.cs index e79f6d7f..5c7b915f 100644 --- a/Src/DSInternals.Common/Serialization/DsiJson.cs +++ b/Src/DSInternals.Common/Serialization/DsiJson.cs @@ -25,8 +25,8 @@ static DsiJson() Options.Converters.Add(new JsonStringEnumConverter()); } - // ---------- String input ---------- - internal static T DeserializeLenient(string json) + // ---------- STRING INPUT ---------- + internal static T? DeserializeLenient(string json) { if (string.IsNullOrWhiteSpace(json)) return default; @@ -49,51 +49,67 @@ internal static T DeserializeLenient(string json) } } - // ---------- Binary input ---------- - internal static T DeserializeLenient(ReadOnlySpan binaryJson, bool utf16 = false) + // ---------- BINARY INPUT ---------- + internal static T? DeserializeLenient(ReadOnlySpan binaryJson, bool utf16 = false) { - var json = DecodeJson(binaryJson, utf16); - return DeserializeLenient(json); - } + if (binaryJson.Length == 0) return default; - internal static string DecodeJson(ReadOnlySpan binaryJson, bool utf16 = false) - { - // Trim terminators/padding on BYTES BEFORE decoding. var trimmed = TrimZeroTerminator(binaryJson, utf16); + if (!utf16) + { + // UTF-8 path + trimmed = TrimUtf8Bom(trimmed); + #if NET8_0_OR_GREATER - string json = (utf16 ? Encoding.Unicode : Encoding.UTF8).GetString(trimmed); + // Fast-path: no string allocation if it already looks like proper JSON + if (!LooksLikeSingleQuotedJsonUtf8(trimmed)) + return JsonSerializer.Deserialize(trimmed, Options); + + string s = Encoding.UTF8.GetString(trimmed); + return DeserializeLenient(s); #else - // .NET Framework: no span GetString; copy to array explicitly. - byte[] buf = trimmed.Length == 0 ? Array.Empty() : new byte[trimmed.Length]; - if (buf.Length != 0) - { - for (int i = 0; i < trimmed.Length; i++) - { - buf[i] = trimmed[i]; - } - } - string json = (utf16 ? Encoding.Unicode : Encoding.UTF8).GetString(buf); + // .NET Framework: decode to string and reuse string path + byte[] buf = new byte[trimmed.Length]; + for (int i = 0; i < trimmed.Length; i++) buf[i] = trimmed[i]; + string s = Encoding.UTF8.GetString(buf); + return DeserializeLenient(s); #endif - // Strip BOM if present - if (json.Length > 0 && json[0] == '\uFEFF') - json = json.Substring(1); + } + else + { + // UTF-16LE path + // Copy span to array (net48-safe), then transcode to UTF-8 using Encoding.Convert + byte[] utf16le = new byte[trimmed.Length]; + for (int i = 0; i < trimmed.Length; i++) utf16le[i] = trimmed[i]; - return json; + byte[] utf8 = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, utf16le, 0, utf16le.Length); + +#if NET8_0_OR_GREATER + ReadOnlySpan utf8Span = utf8; + utf8Span = TrimUtf8Bom(utf8Span); + if (!LooksLikeSingleQuotedJsonUtf8(utf8Span)) + return JsonSerializer.Deserialize(utf8Span, Options); +#endif + // Fallback: go through string to apply single-quote normalization if needed + string s = Encoding.UTF8.GetString(utf8); + return DeserializeLenient(s); + } } + // ---------- Helpers ---------- private static ReadOnlySpan TrimZeroTerminator(ReadOnlySpan input, bool utf16) { if (input.Length == 0) return input; if (utf16) { - // Remove any number of trailing 0x00 0x00 pairs. int len = input.Length; + // remove trailing 0x00 0x00 pairs while (len >= 2 && input[len - 1] == 0 && input[len - 2] == 0) len -= 2; - // Safety: ensure even byte count for UTF-16 + // ensure even count for UTF-16 if ((len & 1) == 1) len -= 1; return input.Slice(0, len); @@ -107,13 +123,56 @@ private static ReadOnlySpan TrimZeroTerminator(ReadOnlySpan input, b } } + private static ReadOnlySpan TrimUtf8Bom(ReadOnlySpan data) + { + if (data.Length >= 3 && data[0] == 0xEF && data[1] == 0xBB && data[2] == 0xBF) + return data.Slice(3); + return data; + } + private static bool LooksLikeSingleQuotedJson(string s) { if (string.IsNullOrEmpty(s)) return false; - var t = s.TrimStart(); - return (t.Length > 0 && (t[0] == '{' || t[0] == '[')) - && s.IndexOf('"') < 0 - && s.IndexOf('\'') >= 0; + + // manual trim-start (no allocation) + int i = 0; + while (i < s.Length) + { + char c = s[i]; + if (c == ' ' || c == '\t' || c == '\r' || c == '\n') { i++; continue; } + break; + } + if (i >= s.Length) return false; + + char first = s[i]; + if (first != '{' && first != '[') return false; + + // heuristic: has at least one ' and no " + return s.IndexOf('"', i) < 0 && s.IndexOf('\'', i) >= 0; + } + + private static bool LooksLikeSingleQuotedJsonUtf8(ReadOnlySpan s) + { + int i = 0; + while (i < s.Length) + { + byte b = s[i]; + if (b == (byte)' ' || b == (byte)'\t' || b == (byte)'\r' || b == (byte)'\n') { i++; continue; } + break; + } + if (i >= s.Length) return false; + + byte first = s[i]; + if (first != (byte)'{' && first != (byte)'[') return false; + + bool hasDouble = false, hasSingle = false; + for (int j = i; j < s.Length; j++) + { + byte b = s[j]; + if (b == (byte)'"') { hasDouble = true; break; } + if (b == (byte)'\'') { hasSingle = true; } + } + return !hasDouble && hasSingle; } // Converts '…' to "…" and preserves apostrophes inside strings (\' -> ') @@ -158,4 +217,4 @@ private static string NormalizeSingleQuotedJson(string input) return sb.ToString(); } } -} \ No newline at end of file +} diff --git a/Src/DSInternals.Json.Benchmarks/DSInternals.Json.Benchmarks.csproj b/Src/DSInternals.Json.Benchmarks/DSInternals.Json.Benchmarks.csproj new file mode 100644 index 00000000..eac311f2 --- /dev/null +++ b/Src/DSInternals.Json.Benchmarks/DSInternals.Json.Benchmarks.csproj @@ -0,0 +1,18 @@ + + + net8.0-windows + Exe + enable + enable + false + + + + + + + + + + + diff --git a/Src/DSInternals.Json.Benchmarks/JsonDecodeBench.cs b/Src/DSInternals.Json.Benchmarks/JsonDecodeBench.cs new file mode 100644 index 00000000..5440967f --- /dev/null +++ b/Src/DSInternals.Json.Benchmarks/JsonDecodeBench.cs @@ -0,0 +1,45 @@ +using System.Text; +using System.Text.Json; +using BenchmarkDotNet.Attributes; +using DSInternals.Common.Serialization; + +namespace DSInternals.Json.Benchmarks +{ + [MemoryDiagnoser] + public class JsonDecodeBench + { + private byte[] _utf8Small, _utf8Medium, _utf8Large; + private string _utf8SmallString, _utf8MediumString, _utf8LargeString; + + [GlobalSetup] + public void Setup() + { + _utf8SmallString = MakeJson(512); // ~0.5 KB + _utf8MediumString = MakeJson(4096); // ~4 KB + _utf8LargeString = MakeJson(65536); // ~64 KB + + _utf8Small = Encoding.UTF8.GetBytes(_utf8SmallString); + _utf8Medium = Encoding.UTF8.GetBytes(_utf8MediumString); + _utf8Large = Encoding.UTF8.GetBytes(_utf8LargeString); + } + + private static string MakeJson(int approxSize) + { + var sb = new StringBuilder(approxSize + 64); + sb.Append('{'); + sb.Append("\"n\":\"Administrator\",\"t\":\"2024-05-07T12:34:56Z\",\"p\":\""); + sb.Append(new string('A', approxSize - 64)); + sb.Append("\"}"); + return sb.ToString(); + } + + [Benchmark] public object STJ_String_Small() => JsonSerializer.Deserialize(_utf8SmallString, DsiJson.Options); + [Benchmark] public object STJ_Bytes_Small() => DsiJson.DeserializeLenient(_utf8Small, utf16: false)!; + + [Benchmark] public object STJ_String_Medium() => JsonSerializer.Deserialize(_utf8MediumString, DsiJson.Options); + [Benchmark] public object STJ_Bytes_Medium() => DsiJson.DeserializeLenient(_utf8Medium, utf16: false)!; + + [Benchmark] public object STJ_String_Large() => JsonSerializer.Deserialize(_utf8LargeString, DsiJson.Options); + [Benchmark] public object STJ_Bytes_Large() => DsiJson.DeserializeLenient(_utf8Large, utf16: false)!; + } +} diff --git a/Src/DSInternals.Json.Benchmarks/LapsBench.cs b/Src/DSInternals.Json.Benchmarks/LapsBench.cs new file mode 100644 index 00000000..a1affd0a --- /dev/null +++ b/Src/DSInternals.Json.Benchmarks/LapsBench.cs @@ -0,0 +1,28 @@ +using System.Text; +using BenchmarkDotNet.Attributes; +using DSInternals.Common.Serialization; +using DSInternals.Common.Data; + +namespace DSInternals.Json.Benchmarks +{ + [MemoryDiagnoser] + public class LapsBench + { + private const string LapsJson = "{\"n\":\"Administrator\",\"p\":\"a998aoEUUXxO32\",\"t\":\"2025-06-01T08:00:00Z\"}"; + private byte[] _utf8; + private byte[] _utf16le; + private string _str; + + [GlobalSetup] + public void Setup() + { + _str = LapsJson; + _utf8 = Encoding.UTF8.GetBytes(LapsJson); + _utf16le = Encoding.Unicode.GetBytes(LapsJson); + } + + [Benchmark] public object Laps_String() => DsiJson.DeserializeLenient(_str)!; + [Benchmark] public object Laps_Utf8_Bytes() => DsiJson.DeserializeLenient(_utf8, utf16: false)!; + [Benchmark] public object Laps_Utf16_Bytes() => DsiJson.DeserializeLenient(_utf16le, utf16: true)!; + } +} diff --git a/Src/DSInternals.Json.Benchmarks/Program.cs b/Src/DSInternals.Json.Benchmarks/Program.cs new file mode 100644 index 00000000..008c80d0 --- /dev/null +++ b/Src/DSInternals.Json.Benchmarks/Program.cs @@ -0,0 +1,10 @@ +using BenchmarkDotNet.Running; + +namespace DSInternals.Json.Benchmarks +{ + public class Program + { + public static void Main(string[] args) => + BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args); + } +} diff --git a/Src/DSInternals.Json.Benchmarks/packages.lock.json b/Src/DSInternals.Json.Benchmarks/packages.lock.json new file mode 100644 index 00000000..a9178481 --- /dev/null +++ b/Src/DSInternals.Json.Benchmarks/packages.lock.json @@ -0,0 +1,287 @@ +{ + "version": 1, + "dependencies": { + "net8.0-windows7.0": { + "BenchmarkDotNet": { + "type": "Direct", + "requested": "[0.15.2, )", + "resolved": "0.15.2", + "contentHash": "5vl4nQFUGTKgOVE5LNoLpv/X/wFQ7wE5yiaJAXCpzgNtUADtfEwbuufKI4o5E2De0VTXNEeom5Hnv8S8vuBZtg==", + "dependencies": { + "BenchmarkDotNet.Annotations": "0.15.2", + "CommandLineParser": "2.9.1", + "Gee.External.Capstone": "2.3.0", + "Iced": "1.21.0", + "Microsoft.CodeAnalysis.CSharp": "4.14.0", + "Microsoft.Diagnostics.Runtime": "3.1.512801", + "Microsoft.Diagnostics.Tracing.TraceEvent": "3.1.21", + "Microsoft.DotNet.PlatformAbstractions": "3.1.6", + "Perfolizer": "[0.5.3]", + "System.Management": "9.0.5" + } + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "BenchmarkDotNet.Annotations": { + "type": "Transitive", + "resolved": "0.15.2", + "contentHash": "a7rVlVmXQRrp3J+HF/FtjwiFcshU6BAuv6U1xtAbqCUYepOEnNGaPeOFvy4It17QZwwofm6U/GAfW3JrFMXszg==" + }, + "CommandLineParser": { + "type": "Transitive", + "resolved": "2.9.1", + "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" + }, + "Gee.External.Capstone": { + "type": "Transitive", + "resolved": "2.3.0", + "contentHash": "2ap/rYmjtzCOT8hxrnEW/QeiOt+paD8iRrIcdKX0cxVwWLFa1e+JDBNeECakmccXrSFeBQuu5AV8SNkipFMMMw==" + }, + "Iced": { + "type": "Transitive", + "resolved": "1.21.0", + "contentHash": "dv5+81Q1TBQvVMSOOOmRcjJmvWcX3BZPZsIq31+RLc5cNft0IHAyNlkdb7ZarOWG913PyBoFDsDXoCIlKmLclg==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "3.11.0", + "contentHash": "v/EW3UE8/lbEYHoC2Qq7AR/DnmvpgdtAMndfQNmpuIMx/Mto8L5JnuCfdBYtgvalQOtfNCnxFejxuRrryvUTsg==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "4.14.0", + "contentHash": "PC3tuwZYnC+idaPuoC/AZpEdwrtX7qFpmnrfQkgobGIWiYmGi5MCRtl5mx6QrfMGQpK78X2lfIEoZDLg/qnuHg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.11.0", + "System.Collections.Immutable": "9.0.0", + "System.Reflection.Metadata": "9.0.0" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "4.14.0", + "contentHash": "568a6wcTivauIhbeWcCwfWwIn7UV7MeHEBvFB2uzGIpM2OhJ4eM/FZ8KS0yhPoNxnSpjGzz7x7CIjTxhslojQA==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.11.0", + "Microsoft.CodeAnalysis.Common": "[4.14.0]", + "System.Collections.Immutable": "9.0.0", + "System.Reflection.Metadata": "9.0.0" + } + }, + "Microsoft.Diagnostics.NETCore.Client": { + "type": "Transitive", + "resolved": "0.2.510501", + "contentHash": "juoqJYMDs+lRrrZyOkXXMImJHneCF23cuvO4waFRd2Ds7j+ZuGIPbJm0Y/zz34BdeaGiiwGWraMUlln05W1PCQ==", + "dependencies": { + "Microsoft.Extensions.Logging": "6.0.0" + } + }, + "Microsoft.Diagnostics.Runtime": { + "type": "Transitive", + "resolved": "3.1.512801", + "contentHash": "0lMUDr2oxNZa28D6NH5BuSQEe5T9tZziIkvkD44YkkCGQXPJqvFjLq5ZQq1hYLl3RjQJrY+hR0jFgap+EWPDTw==", + "dependencies": { + "Microsoft.Diagnostics.NETCore.Client": "0.2.410101" + } + }, + "Microsoft.Diagnostics.Tracing.TraceEvent": { + "type": "Transitive", + "resolved": "3.1.21", + "contentHash": "/OrJFKaojSR6TkUKtwh8/qA9XWNtxLrXMqvEb89dBSKCWjaGVTbKMYodIUgF5deCEtmd6GXuRerciXGl5bhZ7Q==", + "dependencies": { + "Microsoft.Diagnostics.NETCore.Client": "0.2.510501", + "Microsoft.Win32.Registry": "5.0.0", + "System.Collections.Immutable": "8.0.0", + "System.Reflection.Metadata": "8.0.0", + "System.Reflection.TypeExtensions": "4.7.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "8.0.5" + } + }, + "Microsoft.DotNet.PlatformAbstractions": { + "type": "Transitive", + "resolved": "3.1.6", + "contentHash": "jek4XYaQ/PGUwDKKhwR8K47Uh1189PFzMeLqO83mXrXQVIpARZCcfuDedH50YDTepBkfijCZN5U/vZi++erxtg==" + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/HggWBbTwy8TgebGSX5DBZ24ndhzi93sHUBDvP1IxbZD7FDokYzdAr6+vbWGjw2XAfR2EJ1sfKUotpjHnFWPxA==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "Perfolizer": { + "type": "Transitive", + "resolved": "0.5.3", + "contentHash": "EhHo0s4y+tHJKhZHgQvPgFWhAhnQpHHuFzutRzfqfv5z763wvhzXh849ZtpVePQNxXWoFafh1Ta2tZgnSIVsYQ==" + }, + "PeterO.Cbor": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "9fMcLg2SUm9ri1j3gVPYxk6+Ev4l4wu93bYwFG1tvntg1Qy4m0rFDdxStG88XR/W4DggOtBXfPVkC3bLF10nqw==", + "dependencies": { + "PeterO.Numbers": "1.8.2", + "PeterO.URIUtility": "1.0.0" + } + }, + "PeterO.Numbers": { + "type": "Transitive", + "resolved": "1.8.2", + "contentHash": "d+A5KLoWbwOTpvubPaGXLgCzANE00jXmsT+yneHwLe2OlobBBFLaIHyoDwmekuHM17z9hU++RF6mL+zZ2x69nA==" + }, + "PeterO.URIUtility": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "fpRTBsYACMp7NvTECauYRomubWTC3vUNw4hMXdIedP8ctBGK6tea9HOJwE+qVzis6MZYkL3LIs8qeY3rc6Jdlw==" + }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "9.0.5", + "contentHash": "cuzLM2MWutf9ZBEMPYYfd0DXwYdvntp7VCT6a/wvbKCa2ZuvGmW74xi+YBa2mrfEieAXqM4TNKlMmSnfAfpUoQ==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "QhkXUl2gNrQtvPmtBTQHb0YsUrDiDQ2QS09YbtTTiSjGcf7NBqtYbrG/BE06zcBPCKEwQGzIv13IVdXNOSub2w==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.DirectoryServices": { + "type": "Transitive", + "resolved": "9.0.8", + "contentHash": "xN2JrOfhcOyswOflVZG27XlFJDPPqU7AQtAAStWcnKoC8W9XCLOLdAYIrrwiZMfeRhavVErI8HkSO/c2TQ+z2g==" + }, + "System.Management": { + "type": "Transitive", + "resolved": "9.0.5", + "contentHash": "n6o9PZm9p25+zAzC3/48K0oHnaPKTInRrxqFq1fi/5TPbMLjuoCm/h//mS3cUmSy+9AO1Z+qsC/Ilt/ZFatv5Q==", + "dependencies": { + "System.CodeDom": "9.0.5" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "ANiqLu3DxW9kol/hMmTWbt3414t9ftdIuiIU7j80okq2YzAueo120M442xk1kDJWtmZTqWQn7wHDvMRipVOEOQ==", + "dependencies": { + "System.Collections.Immutable": "9.0.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "8.0.5", + "contentHash": "0f1B50Ss7rqxXiaBJyzUu9bWFOO2/zSlifZ/UNMdiIpDYe4cY4LQQicP4nirK1OS31I43rn062UIJ1Q9bpmHpg==" + }, + "dsinternals.common": { + "type": "Project", + "dependencies": { + "PeterO.Cbor": "[4.5.5, )", + "System.DirectoryServices": "[9.0.8, )" + } + } + } + } +} \ No newline at end of file