How to use Span<T> and Memory<T>
https://antao-almada.medium.com/how-to-use-span-t-and-memory-t-c0b126aae652KyryloKuzyk
csharp
2 years ago
902 B
12
Indexable
public long Sum()
{
var itemSize = UnsafeUtility.SizeOf<Foo>();
Span<Foo> buffer = new Foo[100]; // alloc items buffer
var rawBuffer = MemoryMarshal.Cast<Foo, byte>(buffer); // cast items buffer to bytes buffer (no copies)
var bytesRead = stream.Read(rawBuffer);
var sum = 0L;
while (bytesRead > 0)
{
int remainder = bytesRead % itemSize;
for (int i = 0; i < remainder; i++) // read the remaining bytes of the Foo struct till the end
{
int b = stream.ReadByte();
if (b == -1)
break;
rawBuffer[i] = (byte)b;
}
bytesRead += remainder;
var itemsRead = bytesRead / itemSize;
foreach (var foo in buffer.Slice(0, itemsRead)) // iterate through the item buffer
sum += foo.Integer;
bytesRead = stream.Read(rawBuffer);
}
return sum;
}Editor is loading...
Leave a Comment