.net core中的System.Buffers名字空间
最近研究了一下.net core 2.1的基础类库,发现它引入了一个System.Buffers名字空间,里面提供了一系列比较实用的对象,便简单的管中窥豹浏览一下。
ArrayPool<T>
ArrayPool<T>是一个数组类型的对象池,本身ArrayPoo<T>是一个抽象类,但他有一个默认的实现ArrayPoo<T>. Shared,使用方法如下:
var pool = ArrayPool<byte>.Shared;
var buffer = pool.Rent(2048);
try
{
//使用buffer
}
finally
{
pool.Return(buffer);
//归还buffer后不要再使用
}
方法比较简单:
- 通过Rent从对象池中申请buffer
- 使用完后,通过Return将buffer归还至对象池
微软的文档上并没有详细描述默认的ArrayPoo<T>的对象申请算法,但由于其代码是开源的,还是可以到github上看到其实现方式的。
初略的看了一下,貌似也并不复杂,和传统的对象池的维护方式也差不多:
- 系统维持着一个对象池
- 调用Rent的时候,首先会到对象池中查看是否有合适的对象(至少要满足最小长度),如果有则直接返回对象池中的对象,并将其从对象池中移除
- 调用Return时,将对象放置到对象池,从而可以作为下次Rent的候选对象
注:这里只记录了主要相关功能,实际算法比这个复杂。另外,由于没有很详细看实现方式,如要描述不正确的地方欢迎指正
也就是说,return后的对象,很可能被别的地方rent走,因此可能导致读写冲突。(类似于c语言中的野指针,但仍然是安全的,不会造成内存错误)
MemoryPool<T>
除了ArrayPool外,System.Buffers名字空间下还提供了一个MemoryPool,它的使用方式和ArraPool比较类似,基本示例如下:
var pool = MemoryPool<byte>.Shared;
var buffer = pool.Rent(2048);
try
{
var memory = buffer.Memory;
//use Memory<byte>
}
finally
{
buffer.Dispose();
}
整个过程还是非常类似的,不过释放的时候是调用的Dispose方法,用起来实际要更加方便点。不过这里申请到的是Memory<T>对象,可能有的地方不像byte[]那样适用 。
关于MemoryPool的实现,我在github上找了一下,还没有看到。不过由于它返回的是Memory<T>,理论上来讲应该是有更高的效率。(例如,可以把一个大段的buffer分成多个memory返回,从而减少申请新对象)
BinaryPrimitives
BinaryPrimitives位于System.Buffers.Binary名字空间下,它提供了一系列数字和字节互相转换的函数。

它的主要好处是是提供了常用BigEndian类型的数字的支持,在网络编程或者文件解析的方式的时候非常实用,免得造轮子了。
Utf8Parser、Utf8Formatter和Base64
这三个类位于System.Buffers.Text下,它主要用于utf8编码和base64编码下的常用类型的读写,如datetime,guid,bool等,并且支持常用的序列化方式。
这几个类目前官方文档都介绍的不是很详细,目前要详细了解的话只能看代码。由于篇幅所限,这里也不做更多的介绍,以后用到的时候再写单独的文章介绍它们。
参考文章:
.net core中的System.Buffers名字空间的更多相关文章
- [译]如何在.NET Core中使用System.Drawing?
你大概知道System.Drawing,它是一个执行图形相关任务的流行的API,同时它也不属于.NET Core的一部分.最初是把.NET Core作为云端框架设计的,它不包含非云端相关API.另一方 ...
- .net core中关于System.Text.Json的使用
在.Net Framework的时候序列化经常使用Newtonsoft.Json插件来使用,而在.Net Core中自带了System.Text.Json,号称性能更好,今天抽空就来捣鼓一下. 使用起 ...
- EF Core中关于System.Linq.Dynamic.Core的使用(转载)
项目中经常用到组合条件查询,根据用户配置的查询条件进行搜索,拼接SQL容易造成SQL注入,普通的LINQ可以用表达式树来完成,但也比较麻烦.有个System.Linq.Dynamic.Core用起来比 ...
- C和C++中的名字空间和作用域
C和C++中的名字空间和作用域 C语言中有名字空间这个概念吗? 提到名字空间(或者可能更普遍的叫法,命名空间),很可能先想到的是C++,甚至是C#.C中没有名字空间吧?一开始我也是这样认为的,直到我看 ...
- Docker的名字空间
名字空间是 Linux 内核一个强大的特性.每个容器都有自己单独的名字空间,运行在其中的应用都像是在独立的操作系统中运行一样.名字空间保证了容器之间彼此互不影响. pid 名字空间 不同用户的进程就是 ...
- TransactionScope事务处理方法介绍及.NET Core中的注意事项
作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10170712.html 今天在写CzarCms的UnitOfWork的使用使用到了这个Transacti ...
- TransactionScope事务处理方法介绍及.NET Core中的注意事项 SQL Server数据库漏洞评估了解一下 预热ASP.NET MVC 的VIEW [AUTOMAPPER]反射自动注册AUTOMAPPER PROFILE
TransactionScope事务处理方法介绍及.NET Core中的注意事项 作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10170712.ht ...
- 【转】TransactionScope事务处理方法介绍及.NET Core中的注意事项
什么是TransactionScope呢? TransactionScope作为System.Transactions的一部分被引入到.NET 2.0.同时SqlClient for .NET Cor ...
- C++名字空间/C++命名空间
0.序言 名字空间是C++提供的一种解决符号名字冲突的方法. 一个命令空间是一个作用域,在不同名字空间中命名相同的符号代表不同的实体. 通常,利用定义名字空间的办法,可以使模块划分更加方便,减少模块间 ...
随机推荐
- 20155303 2016-2017-2 《Java程序设计》第五周学习总结
20155303 2016-2017-2 <Java程序设计>第五周学习总结 教材学习中的问题和解决过程 『问题一』:受检异常与非受检异常 『问题一解决』: 受检异常:这种在编译时被强制检 ...
- 文件上传submit、ajax方式
submit方式: <form id="postForm" name="postForm" action="${rc.contextPath}/ ...
- casper Dom的操作
phantom.casperTest = true; phantom.outputEncoding="utf-8"; var casper = require('casper'). ...
- mysql ON DUPLICATE KEY UPDATE重复插入时更新
mysql当插入重复时更新的方法: 第一种方法: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (c ...
- php $_FILES处理文件上传
众所周知,文件上传在一些网站应用中是必不可少的一部分.比如个人博客上传个性头像,一些论坛分享好的学习资料等,这就涉及到使用表单处理文件上传的知识,在php中 我们可以使用$_FILES这个全局数组来处 ...
- Angular快速学习笔记(4) -- Observable与RxJS
介绍RxJS前,先介绍Observable 可观察对象(Observable) 可观察对象支持在应用中的发布者和订阅者之间传递消息. 可观察对象可以发送多个任意类型的值 -- 字面量.消息.事件. 基 ...
- Gitlab-使用其它API资源
1. Users: 执行下面的任务去管理用户 List users Get, Create , edit, and delete a user List SSH keys for a given us ...
- 028 -bash-4.1$ 出现故障的原理及解决办法?
最近在搭建分布式的时候,出现了这个问题,很不爽.下面是我的解决方式. 1.在用户下删除bash rm -rf /home/beifeng/.bash* 2.拷贝 cp /etc/skel/.bash* ...
- non linear processor
由于自适应滤波器只能估算回音的近似值,因此它并不能将回音完全消除,也就是说,仍然有些残余的回音(Lres)留在信号当中.在任何时刻中,暂存器中的准确性正是决定残余回音音量的关键所在.如果残 ...
- 001.etcd简介及单节点使用
一 etcd简介 1.1 概述 etcd 是 CoreOS 团队发起的开源项目,是一个管理配置信息和服务发现(service discovery)的项目,它的目标是构建一个高可用的分布式键值(key- ...