本文演示了如何使用 Span<T> 来优化内存管理,并重点介绍了性能优势。
通常,开发人员使用数组将元素序列存储在连续内存位置。数组非常简单易懂。字节数组的代码片段如下所示
// Bad way: Using arrays may lead to unnecessary memory allocations and copying
byte[] data = GetData();
ProcessData(data);
上述代码的问题在于,它可能会导致不必要的内存分配和复制,因为 GetData 每次都会创建一个新数组。上述代码块会降低需要高数据处理的应用程序或内存资源有限的应用程序的性能。
请在下面找到上一个代码片段的重构版本。
// Good way: Using Span<T> avoids additional memory allocation and copying
byte[] data = GetData();
Span<byte> dataSpan = data.AsSpan();
ProcessData(dataSpan);
它提供了连续内存区域的类型安全和内存安全视图,而无需担心前面突出显示的复制问题。Span<T>
使用该方法创建原始数组的视图,而无需每次都复制或创建新内存。AsSpan()
创建另一个名为的类,并添加以下代码片段SpanOverArray
public static class SpanOverArray
{
public static void ProcessData(byte[] data)
{
Console.WriteLine("Processing byte array:");
foreach (var b in data)
{
Console.Write($"{b} ");
}
Console.WriteLine("\n");
}
public static void ProcessData(Span<byte> dataSpan)
{
Console.WriteLine("Processing Span<byte>:");
foreach (var b in dataSpan)
{
Console.Write($"{b} ");
}
Console.WriteLine("\n");
}
}
#region Day 23: Span Over Arrays
static string ExecuteDay23()
{
byte[] largeData = new byte[100]; // Simulate a large data set
Random rng = new Random();
rng.NextBytes(largeData); // Populate with random bytes
// Process using array slice
byte[] slice = new byte[10]; // Creating a new array for the slice
Array.Copy(largeData, 10, slice, 0, 10); // Copying data
SpanOverArray.ProcessData(slice);
// Process using Span<T>
Span<byte> span = largeData.AsSpan(10, 10); // Creating a span starting at index 10
SpanOverArray.ProcessData(span);
return "Executed Day 23 successfully..!!";
}
#endregion
Processing byte array:
75 20 132 37 218 170 182 227 224 146
Processing Span<byte>:
75 20 132 37 218 170 182 227 224 146
源代码获取:公众号回复消息【code:48858
】