Skip to content

Commit df3816d

Browse files
committed
Track JSON perf with source generation
1 parent 3c5dbad commit df3816d

File tree

5 files changed

+40
-2
lines changed

5 files changed

+40
-2
lines changed

src/Components/benchmarkapps/Wasm.Performance/TestApp/Pages/Json.razor

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
<button id="serialize-small" @onclick=SerializeSmall>Serialize (small)</button>
1010
<button id="serialize-large" @onclick=SerializeLarge>Serialize (large)</button>
11+
<button id="serialize-large-sourcegen" @onclick=SerializeLargeSourceGen>Serialize (large with sourcegen)</button>
1112

1213
<p><pre style="border: 1px solid black; overflow: scroll;">@serializedValue</pre></p>
1314
@if (serializedValue != null)
@@ -17,6 +18,7 @@
1718

1819
<button id="deserialize-small" @onclick=DeserializeSmall>Deserialize (small)</button>
1920
<button id="deserialize-large" @onclick=DeserializeLarge>Deserialize (large)</button>
21+
<button id="deserialize-large-sourcegen" @onclick=DeserializeLargeSourceGen>Deserialize (large with sourcegen)</button>
2022

2123
@if (numPeopleDeserialized > 0)
2224
{
@@ -26,6 +28,7 @@
2628
@code {
2729
Person smallOrgChart = Person.GenerateOrgChart(1, 4);
2830
Person largeOrgChart = Person.GenerateOrgChart(5, 4);
31+
PersonJsonContext personJsonContext = new(new(JsonSerializerDefaults.Web));
2932
string smallOrgChartJson;
3033
string largeOrgChartJson;
3134
int numPeopleDeserialized;
@@ -55,12 +58,18 @@
5558
void SerializeLarge()
5659
=> serializedValue = JsonSerializer.Serialize(largeOrgChart);
5760

61+
void SerializeLargeSourceGen()
62+
=> serializedValue = JsonSerializer.Serialize(largeOrgChart, personJsonContext.Person);
63+
5864
void DeserializeSmall()
5965
=> numPeopleDeserialized = Deserialize(smallOrgChartJson);
6066

6167
void DeserializeLarge()
6268
=> numPeopleDeserialized = Deserialize(largeOrgChartJson);
6369

70+
void DeserializeLargeSourceGen()
71+
=> numPeopleDeserialized = CountPeople(JsonSerializer.Deserialize<Person>(largeOrgChartJson, personJsonContext.Person));
72+
6473
static int Deserialize(string json)
6574
{
6675
var ceo = JsonSerializer.Deserialize<Person>(json);

src/Components/benchmarkapps/Wasm.Performance/TestApp/Person.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class Person
1515
public int Salary { get; set; }
1616
public bool IsAdmin { get; set; }
1717
public List<Person> Subordinates { get; set; }
18-
public Dictionary<string, object> SecurityClearances { get; set; }
18+
public Dictionary<string, bool> SecurityClearances { get; set; }
1919

2020
public static Person GenerateOrgChart(int totalDepth, int numDescendantsPerNode, int thisDepth = 0, string namePrefix = null, int siblingIndex = 0)
2121
{
@@ -28,7 +28,7 @@ public static Person GenerateOrgChart(int totalDepth, int numDescendantsPerNode,
2828
IsAdmin = siblingIndex % 2 == 0,
2929
Salary = 10000000 / (thisDepth + 1),
3030
SecurityClearances = Clearances
31-
.ToDictionary(c => c, _ => (object)(rng.Next(0, 2) == 0)),
31+
.ToDictionary(c => c, _ => rng.Next(0, 2) == 0),
3232
Subordinates = Enumerable.Range(0, thisDepth < totalDepth ? numDescendantsPerNode : 0)
3333
.Select(index => GenerateOrgChart(totalDepth, numDescendantsPerNode, thisDepth + 1, name, index))
3434
.ToList()
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System.Text.Json.Serialization;
5+
6+
namespace Wasm.Performance.TestApp
7+
{
8+
[JsonSerializable(typeof(Person), GenerationMode = JsonSourceGenerationMode.MetadataAndSerialization)]
9+
internal partial class PersonJsonContext : JsonSerializerContext
10+
{
11+
}
12+
}

src/Components/benchmarkapps/Wasm.Performance/TestApp/Wasm.Performance.TestApp.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@
1313

1414
<ItemGroup>
1515
<Reference Include="Microsoft.AspNetCore.Components.WebAssembly" />
16+
<Reference Include="System.Text.Json" />
1617
</ItemGroup>
1718
</Project>

src/Components/benchmarkapps/Wasm.Performance/TestApp/wwwroot/benchmarks/jsonHandling.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ group('JSON handling', () => {
3131
}
3232
});
3333

34+
benchmark('Serialize 340kb (Source Generated)', () =>
35+
benchmarkJson(app, '#serialize-large-sourcegen', '#serialized-length', 339803), {
36+
descriptor: {
37+
name: 'blazorwasm/jsonserialize-sourcegen-340kb',
38+
description: 'Serialize JSON (SourceGen) 340kb - Time in ms'
39+
}
40+
});
41+
3442
benchmark('Deserialize 1kb', () =>
3543
benchmarkJson(app, '#deserialize-small', '#deserialized-count', 5), {
3644
descriptor: {
@@ -47,6 +55,14 @@ group('JSON handling', () => {
4755
}
4856
});
4957

58+
benchmark('Deserialize 340kb (Source Generated)', () =>
59+
benchmarkJson(app, '#deserialize-large-sourcegen', '#deserialized-count', 1365), {
60+
descriptor: {
61+
name: 'blazorwasm/jsondeserialize-sourcegen-340kb',
62+
description: 'Deserialize JSON (SourceGen) 340kb - Time in ms'
63+
}
64+
});
65+
5066
benchmark('Serialize 340kb (JavaScript)', () => {
5167
const json = JSON.stringify(largeObjectToSerialize);
5268
if (json.length !== 339803) {

0 commit comments

Comments
 (0)