首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >高效管理内存的利器:彻底理解 Span<T> 和 Memory<T>:

高效管理内存的利器:彻底理解 Span<T> 和 Memory<T>:

作者头像
郑子铭
发布2025-05-06 14:42:05
发布2025-05-06 14:42:05
20600
代码可运行
举报
运行总次数:0
代码可运行

在 .NET 中,Span<T>Memory<T> 旨在提高内存管理效率,减少不必要的分配,从而提升性能。

什么是 Span?

Span<T> 是一种 基于栈(stack-allocated) 的结构,允许高效操作连续的内存区域。

示例

代码语言:javascript
代码运行次数:0
运行
复制
int[] numbers = { 1, 2, 3, 4, 5 };
Span<int> span = numbers;
span[0] = 10;
Console.WriteLine(numbers[0]);

// 输出: 10

在传统方法中,string.Substring() 会创建新的字符串对象,而 Span<T> 通过直接引用原始内存,避免额外的内存分配。

示例:高效处理字符串

代码语言:javascript
代码运行次数:0
运行
复制
using System;

classProgram
{
    static void Main()
    {
        string text = "Order1234: Processed";

        // 使用 Span<T> 提取字符串片段,而不创建新字符串
        ReadOnlySpan<char> span = text.AsSpan();

        ReadOnlySpan<char> orderId = span.Slice(0, 10); // 提取 "Order1234"
        ReadOnlySpan<char> status = span.Slice(12); // 提取 "Processed"

        Console.WriteLine($"订单号: {orderId.ToString()}");
        Console.WriteLine($"状态: {status.ToString()}");
    }
}

优点:避免额外的内存分配,特别适用于大字符串的操作,提高性能。

关键特点

不会分配新内存(减少 GC 压力)。 ✅ 适用于数组、stackalloc 和非托管内存。 ✅ 仅能用于同步方法,不支持 async/await


什么是 Memory?

Memory<T>Span<T> 类似,但 支持异步操作,因为它是 基于堆(heap-allocated) 的。

示例

代码语言:javascript
代码运行次数:0
运行
复制
Memory<int> memory = new int[] { 1, 2, 3, 4, 5 };
Span<int> spanFromMemory = memory.Span;
spanFromMemory[0] = 20;
Console.WriteLine(memory.Span[0]);

// 输出: 20

当处理 大规模数据的异步任务(例如文件 I/O、网络流)时,Memory<T> 非常有用。

示例:读取大文件

代码语言:javascript
代码运行次数:0
运行
复制
using System;
using System.IO;
using System.Threading.Tasks;

classProgram
{
    static async Task Main()
    {
        byte[] buffer = newbyte[1024]; // 1 KB 缓冲区
        Memory<byte> memoryBuffer = buffer;

        using FileStream fileStream = new FileStream("largefile.txt", FileMode.Open, FileAccess.Read);
        int bytesRead = await fileStream.ReadAsync(memoryBuffer);

        Console.WriteLine($"读取字节数: {bytesRead}");
    }
}

为什么选择 Memory?支持异步方法(适用于 async/await 场景)。 ✅ 不需要固定内存(不像 Span<T> 依赖栈或 stackalloc)。 ✅ 适合处理大数据集(如文件流、数据库缓冲区等)。


什么时候使用 Span和 Memory?

特性

Span

Memory

内存分配

栈(Stack)

堆(Heap)

异步支持

❌ 不支持

✅ 支持

性能

🚀 更高

📉 稍低

结论

📌 如果是同步代码,且追求高性能,使用 Span<T>。 📌 如果需要异步处理(如文件 I/O、网络操作),使用 Memory<T>

兼容性

Span<T>Memory<T> 引入于 .NET Core 2.1,并支持以下版本:

  • .NET Standard 2.1
  • .NET Core 2.1 及以上
  • .NET 5、6、7、8(最新版本) ❌ **.NET Framework 不原生支持 Span<T>**,但可以通过 System.Memory NuGet 包实现部分支持。

🔹 合理使用 Span<T>Memory<T>,可以让你的 .NET 代码更加高效! 🚀

本文使用 chatgpt辅助翻译。

作者:Dashrath Hapani,版权归原作者Dashrath Hapani所有

原文链接:csharp.com/article/understanding-spant-memoryt-for-low-level-memory-efficiency/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是 Span?
    • 示例
    • 示例:高效处理字符串
    • 关键特点
  • 什么是 Memory?
    • 示例
    • 示例:读取大文件
  • 什么时候使用 Span和 Memory?
    • 兼容性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档