Skip to content

Commit 5ed2442

Browse files
Fix JSON perf regressions reported by #73242. (#73306)
1 parent bcdcaec commit 5ed2442

File tree

4 files changed

+17
-32
lines changed

4 files changed

+17
-32
lines changed

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializer.Read.Stream.cs

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -431,12 +431,8 @@ private static async IAsyncEnumerable<TValue> CreateAsyncEnumerableDeserializer<
431431
Debug.Assert(queueTypeInfo.IsConfigured);
432432
JsonSerializerOptions options = queueTypeInfo.Options;
433433
var bufferState = new ReadBufferState(options.DefaultBufferSize);
434-
ReadStack readStack = new ReadStack
435-
{
436-
SupportContinuation = true
437-
};
438-
439-
readStack.Initialize(queueTypeInfo);
434+
ReadStack readStack = default;
435+
readStack.Initialize(queueTypeInfo, supportContinuation: true);
440436

441437
var jsonReaderState = new JsonReaderState(options.GetReaderOptions());
442438

@@ -475,11 +471,8 @@ private static async IAsyncEnumerable<TValue> CreateAsyncEnumerableDeserializer<
475471
Debug.Assert(jsonTypeInfo.IsConfigured);
476472
JsonSerializerOptions options = jsonTypeInfo.Options;
477473
var bufferState = new ReadBufferState(options.DefaultBufferSize);
478-
ReadStack readStack = new ReadStack
479-
{
480-
SupportContinuation = true
481-
};
482-
readStack.Initialize(jsonTypeInfo);
474+
ReadStack readStack = default;
475+
readStack.Initialize(jsonTypeInfo, supportContinuation: true);
483476
var jsonReaderState = new JsonReaderState(options.GetReaderOptions());
484477

485478
try
@@ -508,11 +501,8 @@ private static async IAsyncEnumerable<TValue> CreateAsyncEnumerableDeserializer<
508501
Debug.Assert(jsonTypeInfo.IsConfigured);
509502
JsonSerializerOptions options = jsonTypeInfo.Options;
510503
var bufferState = new ReadBufferState(options.DefaultBufferSize);
511-
ReadStack readStack = new ReadStack
512-
{
513-
SupportContinuation = true
514-
};
515-
readStack.Initialize(jsonTypeInfo);
504+
ReadStack readStack = default;
505+
readStack.Initialize(jsonTypeInfo, supportContinuation: true);
516506
var jsonReaderState = new JsonReaderState(options.GetReaderOptions());
517507

518508
try

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializer.Write.Stream.cs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -314,15 +314,10 @@ private static async Task WriteStreamAsync<TValue>(
314314
using (var bufferWriter = new PooledByteBufferWriter(options.DefaultBufferSize))
315315
using (var writer = new Utf8JsonWriter(bufferWriter, writerOptions))
316316
{
317-
WriteStack state = new WriteStack
318-
{
319-
CancellationToken = cancellationToken,
320-
SupportContinuation = true,
321-
SupportAsync = true,
322-
};
323-
317+
WriteStack state = default;
324318
jsonTypeInfo = ResolvePolymorphicTypeInfo(value, jsonTypeInfo, out state.IsPolymorphicRootValue);
325-
state.Initialize(jsonTypeInfo);
319+
state.Initialize(jsonTypeInfo, supportAsync: true, supportContinuation: true);
320+
state.CancellationToken = cancellationToken;
326321

327322
bool isFinalBlock;
328323

@@ -395,13 +390,9 @@ private static void WriteStream<TValue>(
395390
using (var bufferWriter = new PooledByteBufferWriter(options.DefaultBufferSize))
396391
using (var writer = new Utf8JsonWriter(bufferWriter, writerOptions))
397392
{
398-
WriteStack state = new WriteStack
399-
{
400-
SupportContinuation = true
401-
};
402-
393+
WriteStack state = default;
403394
jsonTypeInfo = ResolvePolymorphicTypeInfo(value, jsonTypeInfo, out state.IsPolymorphicRootValue);
404-
state.Initialize(jsonTypeInfo);
395+
state.Initialize(jsonTypeInfo, supportContinuation: true, supportAsync: false);
405396

406397
bool isFinalBlock;
407398

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/ReadStack.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ private void EnsurePushCapacity()
9393
}
9494
}
9595

96-
internal void Initialize(JsonTypeInfo jsonTypeInfo)
96+
internal void Initialize(JsonTypeInfo jsonTypeInfo, bool supportContinuation = false)
9797
{
9898
JsonSerializerOptions options = jsonTypeInfo.Options;
9999
if (options.ReferenceHandlingStrategy == ReferenceHandlingStrategy.Preserve)
@@ -106,6 +106,7 @@ internal void Initialize(JsonTypeInfo jsonTypeInfo)
106106
Current.JsonPropertyInfo = jsonTypeInfo.PropertyInfoForTypeInfo;
107107
Current.NumberHandling = Current.JsonPropertyInfo.EffectiveNumberHandling;
108108
Current.CanContainMetadata = PreserveReferences || jsonTypeInfo.PolymorphicTypeResolver?.UsesTypeDiscriminators == true;
109+
SupportContinuation = supportContinuation;
109110
}
110111

111112
public void Push()

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/WriteStack.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,14 +139,17 @@ private void EnsurePushCapacity()
139139
}
140140
}
141141

142-
internal void Initialize(JsonTypeInfo jsonTypeInfo)
142+
internal void Initialize(JsonTypeInfo jsonTypeInfo, bool supportContinuation = false, bool supportAsync = false)
143143
{
144+
Debug.Assert(!supportAsync || supportContinuation, "supportAsync must imply supportContinuation");
144145
Debug.Assert(!IsContinuation);
145146
Debug.Assert(CurrentDepth == 0);
146147

147148
Current.JsonTypeInfo = jsonTypeInfo;
148149
Current.JsonPropertyInfo = jsonTypeInfo.PropertyInfoForTypeInfo;
149150
Current.NumberHandling = Current.JsonPropertyInfo.EffectiveNumberHandling;
151+
SupportContinuation = supportContinuation;
152+
SupportAsync = supportAsync;
150153

151154
JsonSerializerOptions options = jsonTypeInfo.Options;
152155
if (options.ReferenceHandlingStrategy != ReferenceHandlingStrategy.None)

0 commit comments

Comments
 (0)