Skip to content

Commit b76ef7f

Browse files
authored
Remove buffer copy when writing base64 JSON value (dotnet#97687)
1 parent 558cde6 commit b76ef7f

File tree

3 files changed

+9
-25
lines changed

3 files changed

+9
-25
lines changed

src/libraries/System.Text.Json/src/System/Text/Json/Writer/Utf8JsonWriter.WriteProperties.Bytes.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ private void WriteBase64Minimized(ReadOnlySpan<char> escapedPropertyName, ReadOn
236236

237237
output[BytesPending++] = JsonConstants.Quote;
238238

239-
Base64EncodeAndWrite(bytes, output, encodedLength);
239+
Base64EncodeAndWrite(bytes, output);
240240

241241
output[BytesPending++] = JsonConstants.Quote;
242242
}
@@ -272,7 +272,7 @@ private void WriteBase64Minimized(ReadOnlySpan<byte> escapedPropertyName, ReadOn
272272

273273
output[BytesPending++] = JsonConstants.Quote;
274274

275-
Base64EncodeAndWrite(bytes, output, encodedLength);
275+
Base64EncodeAndWrite(bytes, output);
276276

277277
output[BytesPending++] = JsonConstants.Quote;
278278
}
@@ -322,7 +322,7 @@ private void WriteBase64Indented(ReadOnlySpan<char> escapedPropertyName, ReadOnl
322322

323323
output[BytesPending++] = JsonConstants.Quote;
324324

325-
Base64EncodeAndWrite(bytes, output, encodedLength);
325+
Base64EncodeAndWrite(bytes, output);
326326

327327
output[BytesPending++] = JsonConstants.Quote;
328328
}
@@ -373,7 +373,7 @@ private void WriteBase64Indented(ReadOnlySpan<byte> escapedPropertyName, ReadOnl
373373

374374
output[BytesPending++] = JsonConstants.Quote;
375375

376-
Base64EncodeAndWrite(bytes, output, encodedLength);
376+
Base64EncodeAndWrite(bytes, output);
377377

378378
output[BytesPending++] = JsonConstants.Quote;
379379
}

src/libraries/System.Text.Json/src/System/Text/Json/Writer/Utf8JsonWriter.WriteValues.Bytes.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ private void WriteBase64Minimized(ReadOnlySpan<byte> bytes)
7979
}
8080
output[BytesPending++] = JsonConstants.Quote;
8181

82-
Base64EncodeAndWrite(bytes, output, encodingLength);
82+
Base64EncodeAndWrite(bytes, output);
8383

8484
output[BytesPending++] = JsonConstants.Quote;
8585
}
@@ -130,7 +130,7 @@ private void WriteBase64Indented(ReadOnlySpan<byte> bytes)
130130

131131
output[BytesPending++] = JsonConstants.Quote;
132132

133-
Base64EncodeAndWrite(bytes, output, encodingLength);
133+
Base64EncodeAndWrite(bytes, output);
134134

135135
output[BytesPending++] = JsonConstants.Quote;
136136
}

src/libraries/System.Text.Json/src/System/Text/Json/Writer/Utf8JsonWriter.WriteValues.Helpers.cs

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -35,29 +35,13 @@ private void ValidateWritingValue()
3535
}
3636

3737
[MethodImpl(MethodImplOptions.AggressiveInlining)]
38-
private void Base64EncodeAndWrite(ReadOnlySpan<byte> bytes, Span<byte> output, int encodingLength)
38+
private void Base64EncodeAndWrite(ReadOnlySpan<byte> bytes, Span<byte> output)
3939
{
40-
byte[]? outputText = null;
41-
42-
Span<byte> encodedBytes = encodingLength <= JsonConstants.StackallocByteThreshold ?
43-
stackalloc byte[JsonConstants.StackallocByteThreshold] :
44-
(outputText = ArrayPool<byte>.Shared.Rent(encodingLength));
45-
46-
OperationStatus status = Base64.EncodeToUtf8(bytes, encodedBytes, out int consumed, out int written);
40+
Span<byte> destination = output.Slice(BytesPending);
41+
OperationStatus status = Base64.EncodeToUtf8(bytes, destination, out int consumed, out int written);
4742
Debug.Assert(status == OperationStatus.Done);
4843
Debug.Assert(consumed == bytes.Length);
49-
50-
encodedBytes = encodedBytes.Slice(0, written);
51-
Span<byte> destination = output.Slice(BytesPending);
52-
53-
Debug.Assert(destination.Length >= written);
54-
encodedBytes.Slice(0, written).CopyTo(destination);
5544
BytesPending += written;
56-
57-
if (outputText != null)
58-
{
59-
ArrayPool<byte>.Shared.Return(outputText);
60-
}
6145
}
6246
}
6347
}

0 commit comments

Comments
 (0)