網(wǎng)站首頁 編程語言 正文
最近研究了一下.net core 2.1的基礎(chǔ)類庫,發(fā)現(xiàn)它引入了一個System.Buffers名字空間,里面提供了一系列比較實(shí)用的對象,便簡單的管中窺豹瀏覽一下。
ArrayPool<T>
ArrayPool<T>是一個數(shù)組類型的對象池,本身ArrayPoo<T>是一個抽象類,但他有一個默認(rèn)的實(shí)現(xiàn)ArrayPoo<T>. Shared,使用方法如下:
var pool = ArrayPool<byte>.Shared;
var buffer = pool.Rent(2048);
try
{
//使用buffer
}
finally
{
pool.Return(buffer);
//歸還buffer后不要再使用
}
方法比較簡單:
- 通過Rent從對象池中申請buffer
- 使用完后,通過Return將buffer歸還至對象池
微軟的文檔上并沒有詳細(xì)描述默認(rèn)的ArrayPoo<T>的對象申請算法。
不過并不復(fù)雜,和傳統(tǒng)的對象池的維護(hù)方式也差不多:
- 系統(tǒng)維持著一個對象池
- 調(diào)用Rent的時候,首先會到對象池中查看是否有合適的對象(至少要滿足最小長度),如果有則直接返回對象池中的對象,并將其從對象池中移除
- 調(diào)用Return時,將對象放置到對象池,從而可以作為下次Rent的候選對象
注:這里只記錄了主要相關(guān)功能,實(shí)際算法比這個復(fù)雜。另外,由于沒有很詳細(xì)看實(shí)現(xiàn)方式,如要描述不正確的地方歡迎指正
也就是說,return后的對象,很可能被別的地方rent走,因此可能導(dǎo)致讀寫沖突。(類似于c語言中的野指針,但仍然是安全的,不會造成內(nèi)存錯誤)
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();
}
整個過程還是非常類似的,不過釋放的時候是調(diào)用的Dispose方法,用起來實(shí)際要更加方便點(diǎn)。不過這里申請到的是Memory<T>對象,可能有的地方不像byte[]那樣適用 。
關(guān)于MemoryPool的實(shí)現(xiàn),我在github上找了一下,還沒有看到。不過由于它返回的是Memory<T>,理論上來講應(yīng)該是有更高的效率。(例如,可以把一個大段的buffer分成多個memory返回,從而減少申請新對象)
BinaryPrimitives
BinaryPrimitives位于System.Buffers.Binary名字空間下,它提供了一系列數(shù)字和字節(jié)互相轉(zhuǎn)換的函數(shù)。
它的主要好處是是提供了常用BigEndian類型的數(shù)字的支持,在網(wǎng)絡(luò)編程或者文件解析的方式的時候非常實(shí)用,免得造輪子了。
Utf8Parser、Utf8Formatter和Base64
這三個類位于System.Buffers.Text下,它主要用于utf8編碼和base64編碼下的常用類型的讀寫,如datetime,guid,bool等,并且支持常用的序列化方式。。
原文鏈接:https://www.cnblogs.com/TianFang/p/9193881.html
相關(guān)推薦
- 2022-07-30 jQuery?UI旋轉(zhuǎn)器部件Spinner?Widget_jquery
- 2023-01-11 Android?nonTransitiveRClass資源沖突問題淺析_Android
- 2022-07-18 SQL?Server使用T-SQL進(jìn)階之公用表表達(dá)式(CTE)_MsSql
- 2022-12-21 Input系統(tǒng)之InputReader處理按鍵事件詳解_Android
- 2022-09-29 利用LyScript實(shí)現(xiàn)應(yīng)用層鉤子掃描器_python
- 2022-07-15 Android自定義Camera實(shí)現(xiàn)拍照小功能_Android
- 2022-05-12 ubuntu 20.04 redis fatal error: stdlib.h: No such
- 2022-12-21 Android?ChipGroup收起折疊效果實(shí)現(xiàn)詳解_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支