Browse Source

Eliminate two more allocations

af/merge-core
Jason Nelson 8 years ago
parent
commit
53c9640a51
  1. 11
      src/ImageSharp/MetaData/Profiles/Exif/ExifReader.cs

11
src/ImageSharp/MetaData/Profiles/Exif/ExifReader.cs

@ -6,6 +6,8 @@ using System.Buffers.Binary;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text; using System.Text;
using SixLabors.ImageSharp.IO; using SixLabors.ImageSharp.IO;
using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Primitives;
@ -122,11 +124,10 @@ namespace SixLabors.ImageSharp.MetaData.Profiles.Exif
int length = data.Length / dataTypeSize; int length = data.Length / dataTypeSize;
var result = new TDataType[length]; var result = new TDataType[length];
var buffer = new byte[dataTypeSize];
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)
{ {
data.Slice(i * dataTypeSize, dataTypeSize).CopyTo(buffer); ReadOnlySpan<byte> buffer = data.Slice(i * dataTypeSize, dataTypeSize);
result.SetValue(converter(buffer), i); result.SetValue(converter(buffer), i);
} }
@ -138,10 +139,16 @@ namespace SixLabors.ImageSharp.MetaData.Profiles.Exif
private unsafe string ConvertToString(ReadOnlySpan<byte> buffer) private unsafe string ConvertToString(ReadOnlySpan<byte> buffer)
{ {
#if NETSTANDARD1_1
byte[] bytes = buffer.ToArray(); byte[] bytes = buffer.ToArray();
string result = Encoding.UTF8.GetString(bytes, 0, buffer.Length); string result = Encoding.UTF8.GetString(bytes, 0, buffer.Length);
#else
byte* pointer = (byte*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(buffer));
string result = Encoding.UTF8.GetString(pointer, buffer.Length);
#endif
int nullCharIndex = result.IndexOf('\0'); int nullCharIndex = result.IndexOf('\0');
if (nullCharIndex != -1) if (nullCharIndex != -1)
{ {

Loading…
Cancel
Save