From bcf50cafba6810ad293619632e4ac388d96f72e7 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Thu, 30 Jan 2020 13:39:55 +1100 Subject: [PATCH] Don't use ToArray() when we don't need to. --- Directory.Build.props | 28 ++++++++++++++-------------- src/ImageSharp/ImageExtensions.cs | 22 ++++++++++++++++++++-- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 604153f976..def231a7ae 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -31,27 +31,27 @@ - $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_RUNTIME_INTRINSICS;SUPPORTS_CODECOVERAGE + $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_RUNTIME_INTRINSICS;SUPPORTS_CODECOVERAGE;SUPPORTS_BASE64SPAN - $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_CODECOVERAGE + $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_CODECOVERAGE;SUPPORTS_BASE64SPAN - $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_CODECOVERAGE + $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_CODECOVERAGE;SUPPORTS_BASE64SPAN $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_CODECOVERAGE diff --git a/src/ImageSharp/ImageExtensions.cs b/src/ImageSharp/ImageExtensions.cs index 6cdc948d40..7f753c05a6 100644 --- a/src/ImageSharp/ImageExtensions.cs +++ b/src/ImageSharp/ImageExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. using System; +using System.Buffers; using System.Collections.Generic; using System.IO; using System.Text; @@ -115,8 +116,25 @@ namespace SixLabors.ImageSharp using (var stream = new MemoryStream()) { source.Save(stream, format); - stream.Flush(); - return $"data:{format.DefaultMimeType};base64,{Convert.ToBase64String(stream.ToArray())}"; + + // Always available. + stream.TryGetBuffer(out ArraySegment buffer); + +#if !SUPPORTS_BASE64SPAN + + byte[] sharedBuffer = ArrayPool.Shared.Rent(buffer.Count); + try + { + buffer.AsSpan().CopyTo(sharedBuffer); + return $"data:{format.DefaultMimeType};base64,{Convert.ToBase64String(sharedBuffer)}"; + } + finally + { + ArrayPool.Shared.Return(sharedBuffer); + } +#else + return $"data:{format.DefaultMimeType};base64,{Convert.ToBase64String(buffer)}"; +#endif } } }