Skip to content

Commit 8714565

Browse files
Copilotstephentoub
authored andcommitted
Apply performance optimizations using MemoryMarshal.TryGetArray
Co-authored-by: stephentoub <[email protected]>
1 parent 3073246 commit 8714565

File tree

3 files changed

+23
-8
lines changed

3 files changed

+23
-8
lines changed

src/ModelContextProtocol.Core/Protocol/BlobResourceContents.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Diagnostics;
2+
using System.Runtime.InteropServices;
23
using System.Text.Json.Serialization;
34

45
namespace ModelContextProtocol.Protocol;
@@ -58,10 +59,11 @@ public ReadOnlyMemory<byte> Data
5859
{
5960
if (_decodedData is null)
6061
{
61-
#if NET6_0_OR_GREATER
62+
#if NET
6263
_decodedData = Convert.FromBase64String(System.Text.Encoding.UTF8.GetString(Blob.Span));
6364
#else
64-
_decodedData = Convert.FromBase64String(System.Text.Encoding.UTF8.GetString(Blob.ToArray()));
65+
byte[] array = MemoryMarshal.TryGetArray(Blob, out ArraySegment<byte> segment) && segment.Offset == 0 && segment.Count == segment.Array!.Length ? segment.Array : Blob.ToArray();
66+
_decodedData = Convert.FromBase64String(System.Text.Encoding.UTF8.GetString(array));
6567
#endif
6668
}
6769
return _decodedData;

src/ModelContextProtocol.Core/Protocol/ContentBlock.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.ComponentModel;
33
using System.Diagnostics;
44
using System.Diagnostics.CodeAnalysis;
5+
using System.Runtime.InteropServices;
56
using System.Text.Json;
67
using System.Text.Json.Nodes;
78
using System.Text.Json.Serialization;
@@ -424,10 +425,11 @@ public ReadOnlyMemory<byte> DecodedData
424425
{
425426
if (_decodedData is null)
426427
{
427-
#if NET6_0_OR_GREATER
428+
#if NET
428429
_decodedData = Convert.FromBase64String(System.Text.Encoding.UTF8.GetString(Data.Span));
429430
#else
430-
_decodedData = Convert.FromBase64String(System.Text.Encoding.UTF8.GetString(Data.ToArray()));
431+
byte[] array = MemoryMarshal.TryGetArray(Data, out ArraySegment<byte> segment) && segment.Offset == 0 && segment.Count == segment.Array!.Length ? segment.Array : Data.ToArray();
432+
_decodedData = Convert.FromBase64String(System.Text.Encoding.UTF8.GetString(array));
431433
#endif
432434
}
433435
return _decodedData;
@@ -488,10 +490,11 @@ public ReadOnlyMemory<byte> DecodedData
488490
{
489491
if (_decodedData is null)
490492
{
491-
#if NET6_0_OR_GREATER
493+
#if NET
492494
_decodedData = Convert.FromBase64String(System.Text.Encoding.UTF8.GetString(Data.Span));
493495
#else
494-
_decodedData = Convert.FromBase64String(System.Text.Encoding.UTF8.GetString(Data.ToArray()));
496+
byte[] array = MemoryMarshal.TryGetArray(Data, out ArraySegment<byte> segment) && segment.Offset == 0 && segment.Count == segment.Array!.Length ? segment.Array : Data.ToArray();
497+
_decodedData = Convert.FromBase64String(System.Text.Encoding.UTF8.GetString(array));
495498
#endif
496499
}
497500
return _decodedData;

src/ModelContextProtocol.Core/Server/AIFunctionMcpServerResource.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Globalization;
88
using System.Reflection;
99
using System.Runtime.CompilerServices;
10+
using System.Runtime.InteropServices;
1011
using System.Text;
1112
using System.Text.Json;
1213
using System.Text.Json.Nodes;
@@ -391,7 +392,14 @@ public override async ValueTask<ReadResourceResult> ReadAsync(
391392

392393
DataContent dc => new()
393394
{
394-
Contents = [new BlobResourceContents { Uri = request.Params!.Uri, MimeType = dc.MediaType, Blob = System.Text.Encoding.UTF8.GetBytes(dc.Base64Data.ToString()) }],
395+
Contents = [new BlobResourceContents
396+
{
397+
Uri = request.Params!.Uri,
398+
MimeType = dc.MediaType,
399+
Blob = MemoryMarshal.TryGetArray(dc.Base64Data, out ArraySegment<char> segment) && segment.Offset == 0 && segment.Count == segment.Array!.Length
400+
? System.Text.Encoding.UTF8.GetBytes(segment.Array)
401+
: System.Text.Encoding.UTF8.GetBytes(dc.Base64Data.ToString())
402+
}],
395403
},
396404

397405
string text => new()
@@ -420,7 +428,9 @@ public override async ValueTask<ReadResourceResult> ReadAsync(
420428
{
421429
Uri = request.Params!.Uri,
422430
MimeType = dc.MediaType,
423-
Blob = System.Text.Encoding.UTF8.GetBytes(dc.Base64Data.ToString())
431+
Blob = MemoryMarshal.TryGetArray(dc.Base64Data, out ArraySegment<char> segment) && segment.Offset == 0 && segment.Count == segment.Array!.Length
432+
? System.Text.Encoding.UTF8.GetBytes(segment.Array)
433+
: System.Text.Encoding.UTF8.GetBytes(dc.Base64Data.ToString())
424434
},
425435

426436
_ => throw new InvalidOperationException($"Unsupported AIContent type '{ac.GetType()}' returned from resource function."),

0 commit comments

Comments
 (0)