.NET C#基础教程第23天:Span<T> over Arrays

作者:微信公众号:【架构师老卢】
6-10 9:41
51

概述:介绍本文演示了如何使用 SpanT 来优化内存管理,并重点介绍了性能优势。学习目标数组在内存管理中的缺点跨度效率开发人员的先决条件基本了解 C# 编程语言。开始数组的缺点通常,开发人员使用数组将元素序列存储在连续内存位置。数组非常简单易懂。字节数组的代码片段如下所示// Bad way: Using arrays may lead to unnecessary memory allocations and copyingbyte[] data = GetData();ProcessData(data);上述代码的问题在于,它可能会导致不必要的内存分配和复制,因为 GetData 每次都会创建一

介绍

本文演示了如何使用 Span<T> 来优化内存管理,并重点介绍了性能优势。

学习目标

  • 数组在内存管理中的缺点
  • 跨度效率

开发人员的先决条件

  • 基本了解 C# 编程语言。

开始

数组的缺点

通常,开发人员使用数组将元素序列存储在连续内存位置。数组非常简单易懂。字节数组的代码片段如下所示

// 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");
    }
}

从 main 方法执行,如下所示

#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

相关代码下载地址
重要提示!:取消关注公众号后将无法再启用回复功能,不支持解封!
第一步:微信扫码关键公众号“架构师老卢”
第二步:在公众号聊天框发送code:48858,如:code:48858 获取下载地址
第三步:恭喜你,快去下载你想要的资源吧
阅读排行