You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Span<T>与Memory<T>落地耗时久?是技术演进还是设计遗漏?

关于Span与Memory的设计疑问解答

一、为什么Span与Memory的实现耗时如此之久?

其实得从C#和.NET的演进逻辑来看——这俩不是凭空蹦出来的,而是要解决一系列长期存在的痛点,同时还要兼顾整个生态的兼容性和稳定性:

  • 底层约束的突破难度:在它们出现前,.NET的内存模型里,托管代码和非托管代码的操作边界清晰但僵硬。Span要做到既安全访问栈内存、托管堆内存,又能直接操作非托管内存,这要求CLR层面做大量修改:比如扩展ByReference<T>的支持、调整GC的跟踪逻辑,确保Span不会导致内存泄漏或野指针。这些底层改动可不是小工程,得反复验证兼容性,怕搞砸现有代码。
  • 生态兼容性的考量:.NET已经有庞大的类库和应用生态,新特性不能破坏现有代码。比如Span要和现有集合、IO操作无缝对接,还要设计一套不冲突的接口;还要考虑异步场景下Memory的线程安全问题,这些都需要大量场景测试和迭代,急不得。
  • 设计理念的打磨:Span和Memory的核心是**"零拷贝"内存访问**,早年.NET更注重开发效率和安全性,内存性能优化不是优先级最高的。直到云原生、高并发场景普及,这个需求才凸显。团队得反复论证API设计:比如区分Span(栈绑定,同步场景)和Memory(可异步,堆/非托管内存)的职责边界,确保简洁易用又能发挥最大性能,这个过程需要时间沉淀。

二、是底层技术变化促成新增,还是初始设计遗漏?

更准确地说,是场景需求爆发+底层技术演进共同推动的结果,不能简单归为"遗漏":

  • 不是初始设计遗漏:早期.NET定位是快速开发企业级应用,内存性能问题在当时场景下不突出,设计重点放在托管代码安全性、GC自动化上。Span这类直接操作内存的特性,在当时反而可能被视为"不安全",不符合当时的设计优先级。
  • 底层技术变化的支撑:随着硬件发展(多核CPU、大内存服务器),以及云服务、高吞吐应用普及,零拷贝、低内存开销的需求越来越强烈。同时CLR多年演进积累了足够技术基础:比如值类型优化、非托管内存交互成熟化,才撑得起Span这种深度整合运行时的特性。
  • 场景需求的倒逼:比如处理大量IO数据、高性能计算场景时,传统内存拷贝(字节数组到流的多次拷贝)的性能损耗越来越明显。社区对高效内存操作的呼声越来越高,促使.NET团队把Span这类特性提上日程,最终在.NET Core 2.1中正式推出。

说白了,它们不是"本该一开始就有"的设计,而是.NET跟着时代需求和底层能力一起成长的产物——编程语言也得与时俱进嘛。

内容的提问来源于stack exchange,提问作者Srivathsa Harish Venkataramana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:43:15