網站首頁 編程語言 正文
最近研究了一下.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>的對象申請算法。
不過并不復雜,和傳統的對象池的維護方式也差不多:
- 系統維持著一個對象池
- 調用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等,并且支持常用的序列化方式。。
原文鏈接:https://www.cnblogs.com/TianFang/p/9193881.html
相關推薦
- 2022-07-04 C#使用文件流FileStream和內存流MemoryStream操作底層字節數組byte[]_C#
- 2023-03-27 Android?WorkManager實現后臺定時任務流程詳解_Android
- 2022-04-26 Python?Pandas學習之數據離散化與合并詳解_python
- 2022-06-28 深入解析docker文件分層原理_docker
- 2022-08-03 Redis生成全局唯一ID的實現方法_Redis
- 2022-11-16 C語言數據結構之雙鏈表&循環鏈表&靜態鏈表詳解_C 語言
- 2023-05-30 Pandas.concat連接DataFrame,Series的示例代碼_python
- 2022-10-06 Django數據映射(一對一,一對多,多對多)_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支