0

0

c# System.IO.Pipelines 和 NetworkStream 的性能对比

幻夢星雲

幻夢星雲

发布时间:2026-01-14 23:02:02

|

886人浏览过

|

来源于php中文网

原创

Pipelines 比 NetworkStream 快的根本原因是零拷贝内存访问和无状态机同步模型,减少 GC 压力 30%~60%、CPU 时间 20%~40%,尤其适合小包高频复用场景。

c# system.io.pipelines 和 networkstream 的性能对比

System.IO.Pipelines 为什么比 NetworkStream 快

根本原因不在“管道”本身,而在内存管理和同步模型。NetworkStream 默认走 Stream.ReadAsync / WriteAsync,每次调用都触发一次 MemoryArraySegment → 内部缓冲区拷贝,还常伴随 Task 分配和状态机开销。Pipelines 的 PipeReader 直接暴露 ReadOnlySequence,数据零拷贝进入用户逻辑;PipeWriterAdvance 也只移动指针,不搬运字节

典型场景下(如 HTTP 解析、Protobuf 反序列化),Pipelines 能减少 30%~60% 的 GC 压力和 20%~40% 的 CPU 时间 —— 尤其在小包高频通信时更明显。

NetworkStream 什么时候反而更简单可靠

不是所有场景都值得为性能上 Pipelines。如果你只是做一次性 TCP 连接、协议简单(比如发个 JSON 请求拿个响应)、吞吐量低于 1K QPS,NetworkStream 的代码量和调试成本显著更低。

  • NetworkStream 天然支持 Timeout 属性(ReadTimeout/WriteTimeout),而 Pipelines 需手动结合 CancellationToken + ValueTask 状态判断
  • 异常堆更直白:IOException: Unable to read data from the transport connection 比 Pipelines 中 InvalidOperationException: Cannot await a completed result 更容易定位网络中断
  • HttpClientTcpClient.GetStream() 无缝衔接,无额外适配层

真实压测中 Pipelines 的关键配置陷阱

没调好 PipeOptions,Pipelines 可能比 NetworkStream 还慢。常见误配:

  • 默认 PipeOptions.PoolSize = 4096,但高并发下小 buffer 频繁分配会触发 GC —— 建议设为 8192 或更高(需权衡内存占用
  • MinimumSegmentSize 设太小(如 512)会导致大量小段内存碎片;设太大(如 1MB)又浪费;推荐 4KB~16KB 区间,匹配多数网卡 MTU
  • 漏掉 UseSynchronizationContext = false,在 ASP.NET Core 默认同步上下文里会引发线程争用

正确初始化示例:

外贸网站管理系统中英文双语版
外贸网站管理系统中英文双语版

蓝科外贸网站管理系统中英文双语版v1.8是针对外贸中小企业而开发的具有简单易用、功能强大,性价比高、扩展性好,安全性高、稳定性好的系统,可以加快外贸企业网站开发的速度和减少开发的成本。让不同的用户在懂的少许html语言的基础上,就能够快速的构建一个风格个性化的而功能强大的中英文企业网站。

下载
var options = new PipeOptions(
    pool: ArrayPool.Create(8192, 1024),
    minimumSegmentSize: 4096,
    useSynchronizationContext: false);
var pipe = new Pipe(options);

从 NetworkStream 迁移到 Pipelines 的最小改动路径

不要重写整个通信层。优先替换接收侧,保留 NetworkStream 发送逻辑过渡:

  • TcpClient.GetStream() 获取 NetworkStream 后,立即包装成 StreamPipeReadernew StreamPipeReader(stream, options)
  • 发送仍用 stream.WriteAsync(...),等读侧稳定后再把写逻辑迁到 PipeWriter
  • 注意:Pipelines 不自动处理粘包/半包,必须自己实现 SequenceReader 边界判断 —— 别直接用 reader.TryRead(out var result) 就解析,要循环直到满足协议长度

粘包处理示意:

while (true)
{
    var result = await reader.ReadAsync(ct);
    var buffer = result.Buffer;
    if (!buffer.IsEmpty)
    {
        var reader = new SequenceReader(buffer);
        while (reader.TryReadLittleEndian(out int len) && reader.Remaining >= len)
        {
            // 解析 len 字节的有效载荷
            reader.Advance(len);
        }
        reader.AdvanceTo(buffer.Start, buffer.End);
    }
    if (result.IsCompleted) break;
}

Pipelines 的性能优势只有在协议解析逻辑足够轻、且连接复用率高时才真正释放。单次短连接 + 复杂 JSON 序列化,NetworkStream 可能更省心。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

411

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

532

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

387

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

571

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

387

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

571

2023.08.10

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号