.NET高性能内存管理

.NET高性能内存管理

你是不是还不了解spanMemeoryArrayPool这些用法,随着.net的不断升级,像这些提高性能的用法也层出不穷,本文重点介绍一些能够提升.net性能的用法

开篇之前,先说下提高性能的宗旨,无非就是尽量减少堆上重新分配与数据复制,让内存得以重用或在栈上分配,从而降低 GC 压力、提升访问速度

Span、ReadOnlySpan

它是栈上的结构(ref struct),所以不会触发GC,可以提供数组、字符串等的零拷贝切片,生命周期仅仅局限于当前的栈,也就是当前方法结束,就会清除,不可以跨方法或者异步操作传递。
ReadOnlySpan<T>ref struct,只能用于:局部变量、方法参数/返回值,或 ref struct 的实例字段。

整体比较好用,不过我觉得比较鸡肋的一点是只能在同步方法中使用,不能再异步方法中传递,因为await本质会把方法状态机移到堆上,不过又推出了Memory解决了这个问题,见下文。

csharp 复制代码
{
    string csv = "1,2,3,4,5";
    ReadOnlySpan<char> span = csv.AsSpan();
    ReadOnlySpan<char> firstTwo = span.Slice(0, 3);
    firstTwo.ToString().Display(); // 输出 "1,2"此时没有有新的字符串分配
    csv.Substring(0,3).Display(); // 输出 "1,2",此时有新的字符串分配
}

Span<T>仅创建视图,不分配新对象,相比 Substring 或数组切片性能高且无 GC 影响。

堆上切片Memory 、 ReadOnlyMemory

特点和用法类似于Span,不同点时可以分配到堆上

csharp 复制代码
async Task<int> ReadStreamAsync(Stream stream)
{
    Memory<byte> buffer = new byte[1024];
    int bytesRead = await stream.ReadAsync(buffer);
    return bytesRead;
}

上面返回的是Memory类型,传统的方式是返回byte\[\],但是byte\[\] 可能导致异步复制,Memory 可直接传递,减少内存分配

在实际开发中,Span其实可以和Memory根据需求进行转换,比如Memory转换成span
Span<T> span = buffer.Span

同样,也可以把span转换为Memory
Memory<T> m = MemoryMarshal.AsMemory(span);

相关推荐
0x000711 小时前
译 Anders Hejlsberg 谈 C# 与 .NET
开发语言·c#·.net
AI行业学习12 小时前
.NET Framework 3.5 SP1 完整离线包(2029.5.29)
开发语言·windows·.net
AI行业学习13 小时前
.NET Framework 3.5 官方离线包下载+完整安装教程【2026.5.29】
windows·.net·notepad++
我是唐青枫15 小时前
C#.NET YARP 服务发现实战:接入 Consul 和 Kubernetes 动态发现后端服务
c#·服务发现·.net
一个帅气昵称啊15 小时前
NetcoreKevin:.NET 企业级智能体管理框架
.net
light blue bird15 小时前
工序路径主子表单工序组装图表组件
前端·数据库·信息可视化·.net·web端·razor page
SEO-狼术15 小时前
Visualize Trends with Bar Charts
pdf·.net
步步为营DotNet16 小时前
解锁.NET 11:Native AOT 在高性能后端服务的深度实践与剖析
.net
望晨空忧1 天前
Avalonia 制作复杂布局动画
.net·avalonia
唐青枫1 天前
C#.NET YARP 服务发现实战:接入 Consul 和 Kubernetes 动态发现后端服务
c#·.net