.net core中的System.Buffers名字空间

本文介绍了.NET Core 2.1中System.Buffers名字空间下的几个核心组件,包括ArrayPool<T>和MemoryPool<T>两个对象池类,以及BinaryPrimitives、Utf8Parser、Utf8Formatter和Base64等用于数据转换和序列化的类。这些工具能够提高应用程序的性能。

最近研究了一下.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后不要再使用
}

方法比较简单:

  1. 通过Rent从对象池中申请buffer
  2. 使用完后,通过Return将buffer归还至对象池

微软的文档上并没有详细描述默认的ArrayPoo<T>的对象申请算法,但由于其代码是开源的,还是可以到github上看到其实现方式的。

初略的看了一下,貌似也并不复杂,和传统的对象池的维护方式也差不多:

  1. 系统维持着一个对象池
  2. 调用Rent的时候,首先会到对象池中查看是否有合适的对象(至少要满足最小长度),如果有则直接返回对象池中的对象,并将其从对象池中移除
  3. 调用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等,并且支持常用的序列化方式。

这几个类目前官方文档都介绍的不是很详细,目前要详细了解的话只能看代码。由于篇幅所限,这里也不做更多的介绍,以后用到的时候再写单独的文章介绍它们。

 

参考文章:

  1. ArrayPool<T> Class
  2. Pooling large arrays with ArrayPool

转载于:https://www.cnblogs.com/TianFang/p/9193881.html

那如是這則錯誤訊息呢?  如需叫用 Just-In-Time (JIT) 偵錯的詳細資料, 請參閱本訊息結尾處 (而非這個對話方塊) 的資訊。 ************** 例外狀況文字 ************** System.OutOfMemoryException: 陣列維度超出支援的範圍。 於 System.Collections.Generic.List`1.set_Capacity(Int32 value) 於 System.Collections.Generic.List`1.EnsureCapacity(Int32 min) 於 System.Collections.Generic.List`1.Add(T item) 於 AssetStudioGUI.Studio.BuildAssetData() 於 C:\projects\assetstudio\AssetStudioGUI\Studio.cs: 行 216 於 System.Threading.Tasks.Task`1.InnerInvoke() 於 System.Threading.Tasks.Task.Execute() --- 先前擲回例外狀況之位置中的堆疊追蹤結尾 --- 於 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 於 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 於 AssetStudioGUI.AssetStudioGUIForm.<BuildAssetStructures>d__55.MoveNext() 於 C:\projects\assetstudio\AssetStudioGUI\AssetStudioGUIForm.cs: 行 209 --- 先前擲回例外狀況之位置中的堆疊追蹤結尾 --- 於 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() ************** 已載入的組件 ************** mscorlib 組件版本: 4.0.0.0 Win32 版本: 4.8.4772.0 built by: NET48REL1LAST_C 程式碼庫: file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll ---------------------------------------- AssetStudioGUI 組件版本: 0.16.47.0 Win32 版本: 0.16.47 程式碼庫: file:///C:/Users/daniiellyu/Desktop/Work/Downloads/AssetStudio.net472.v0.16.47/AssetStudioGUI.exe ---------------------------------------- System.Windows.Forms 組件版本: 4.0.0.0 Win32 版本: 4.8.4734.0 built by: NET48REL1LAST_C 程式碼庫: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll ---------------------------------------- System 組件版本: 4.0.0.0 Win32 版本: 4.8.4767.0 built by: NET48REL1LAST_C 程式碼庫: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll ---------------------------------------- System.Drawing 組件版本: 4.0.0.0 Win32 版本: 4.8.4390.0 built by: NET48REL1LAST_C 程式碼庫: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll ---------------------------------------- AssetStudioUtility 組件版本: 0.16.47.0 Win32 版本: 0.16.47 程式碼庫: file:///C:/Users/daniiellyu/Desktop/Work/Downloads/AssetStudio.net472.v0.16.47/AssetStudioUtility.DLL ---------------------------------------- OpenTK 組件版本: 3.1.0.0 Win32 版本: 3.1.0 程式碼庫: file:///C:/Users/daniiellyu/Desktop/Work/Downloads/AssetStudio.net472.v0.16.47/OpenTK.DLL ---------------------------------------- AssetStudio 組件版本: 0.16.47.0 Win32 版本: 0.16.47 程式碼庫: file:///C:/Users/daniiellyu/Desktop/Work/Downloads/AssetStudio.net472.v0.16.47/AssetStudio.DLL ---------------------------------------- System.Core 組件版本: 4.0.0.0 Win32 版本: 4.8.4762.0 built by: NET48REL1LAST_B 程式碼庫: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll ---------------------------------------- Mono.Cecil 組件版本: 0.11.3.0 Win32 版本: 0.11.3.0 程式碼庫: file:///C:/Users/daniiellyu/Desktop/Work/Downloads/AssetStudio.net472.v0.16.47/Mono.Cecil.DLL ---------------------------------------- System.Configuration 組件版本: 4.0.0.0 Win32 版本: 4.8.4190.0 built by: NET48REL1LAST_B 程式碼庫: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll ---------------------------------------- System.Xml 組件版本: 4.0.0.0 Win32 版本: 4.8.4084.0 built by: NET48REL1 程式碼庫: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll ---------------------------------------- OpenTK.GLControl 組件版本: 3.1.0.0 Win32 版本: 3.1.0 程式碼庫: file:///C:/Users/daniiellyu/Desktop/Work/Downloads/AssetStudio.net472.v0.16.47/OpenTK.GLControl.DLL ---------------------------------------- mscorlib.resources 組件版本: 4.0.0.0 Win32 版本: 4.8.4084.0 built by: NET48REL1 程式碼庫: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_zh-Hant_b77a5c561934e089/mscorlib.resources.dll ---------------------------------------- AssetStudio.PInvoke 組件版本: 0.16.47.0 Win32 版本: 0.16.47 程式碼庫: file:///C:/Users/daniiellyu/Desktop/Work/Downloads/AssetStudio.net472.v0.16.47/AssetStudio.PInvoke.DLL ---------------------------------------- Accessibility 組件版本: 4.0.0.0 Win32 版本: 4.8.4084.0 built by: NET48REL1 程式碼庫: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Accessibility/v4.0_4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll ---------------------------------------- System.Memory 組件版本: 4.0.1.1 Win32 版本: 4.6.28619.01 程式碼庫: file:///C:/Users/daniiellyu/Desktop/Work/Downloads/AssetStudio.net472.v0.16.47/System.Memory.DLL ---------------------------------------- System.Runtime.CompilerServices.Unsafe 組件版本: 4.0.6.0 Win32 版本: 4.700.19.56404 程式碼庫: file:///C:/Users/daniiellyu/Desktop/Work/Downloads/AssetStudio.net472.v0.16.47/System.Runtime.CompilerServices.Unsafe.DLL ---------------------------------------- System.Runtime 組件版本: 4.0.0.0 Win32 版本: 4.8.4084.0 程式碼庫: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Runtime/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Runtime.dll ---------------------------------------- SixLabors.ImageSharp 組件版本: 1.0.0.0 Win32 版本: 1.0.3.0 程式碼庫: file:///C:/Users/daniiellyu/Desktop/Work/Downloads/AssetStudio.net472.v0.16.47/SixLabors.ImageSharp.DLL ---------------------------------------- System.Numerics 組件版本: 4.0.0.0 Win32 版本: 4.8.4084.0 built by: NET48REL1 程式碼庫: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Numerics/v4.0_4.0.0.0__b77a5c561934e089/System.Numerics.dll ---------------------------------------- System.Buffers 組件版本: 4.0.3.0 Win32 版本: 4.6.28619.01 程式碼庫: file:///C:/Users/daniiellyu/Desktop/Work/Downloads/AssetStudio.net472.v0.16.47/System.Buffers.DLL ---------------------------------------- Texture2DDecoderWrapper 組件版本: 0.16.47.0 Win32 版本: 0.16.47 程式碼庫: file:///C:/Users/daniiellyu/Desktop/Work/Downloads/AssetStudio.net472.v0.16.47/Texture2DDecoderWrapper.DLL ---------------------------------------- K4os.Compression.LZ4 組件版本: 1.1.11.0 Win32 版本: 1.1.11 程式碼庫: file:///C:/Users/daniiellyu/Desktop/Work/Downloads/AssetStudio.net472.v0.16.47/K4os.Compression.LZ4.DLL ---------------------------------------- SixLabors.ImageSharp.Drawing 組件版本: 1.0.0.0 Win32 版本: 1.0.0.0 程式碼庫: file:///C:/Users/daniiellyu/Desktop/Work/Downloads/AssetStudio.net472.v0.16.47/SixLabors.ImageSharp.Drawing.DLL ---------------------------------------- System.Windows.Forms.resources 組件版本: 4.0.0.0 Win32 版本: 4.8.4084.0 built by: NET48REL1 程式碼庫: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_zh-Hant_b77a5c561934e089/System.Windows.Forms.resources.dll ---------------------------------------- SixLabors.Fonts 組件版本: 1.0.0.0 Win32 版本: 1.0.0.0 程式碼庫: file:///C:/Users/daniiellyu/Desktop/Work/Downloads/AssetStudio.net472.v0.16.47/SixLabors.Fonts.DLL ---------------------------------------- netstandard 組件版本: 2.0.0.0 Win32 版本: 4.8.4084.0 程式碼庫: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/netstandard/v4.0_2.0.0.0__cc7b13ffcd2ddd51/netstandard.dll ---------------------------------------- System.Numerics.Vectors 組件版本: 4.1.4.0 Win32 版本: 4.6.26515.06 程式碼庫: file:///C:/Users/daniiellyu/Desktop/Work/Downloads/AssetStudio.net472.v0.16.47/System.Numerics.Vectors.DLL ---------------------------------------- Newtonsoft.Json 組件版本: 13.0.0.0 Win32 版本: 13.0.1.25517 程式碼庫: file:///C:/Users/daniiellyu/Desktop/Work/Downloads/AssetStudio.net472.v0.16.47/Newtonsoft.Json.DLL ---------------------------------------- System.Runtime.Serialization 組件版本: 4.0.0.0 Win32 版本: 4.8.4724.0 built by: NET48REL1LAST_C 程式碼庫: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Serialization/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll ---------------------------------------- System.Data 組件版本: 4.0.0.0 Win32 版本: 4.8.4690.0 built by: NET48REL1LAST_B 程式碼庫: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_64/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll ---------------------------------------- ************** JIT 偵錯 ************** 若要啟用 Just-In-Time (JIT) 偵錯功能,則必須在 此應用程式或電腦的 .config 檔案中,設定 system.windows.forms 區段內的 jitDebugging 值。 且該應用程式也必須在啟用偵錯的狀態下進行 編譯。 例如: <configuration> <system.windows.forms jitDebugging="true" /> </configuration> 當 JIT 偵錯功能啟用後,會將所有未處理的例外狀況 傳送給電腦上已註冊的 JIT 偵錯工具進行處 理,而不是使用這個對話方塊來處理。
最新发布
07-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值