数据写入规则IBufferWriterT
??????? IBufferWriter<T>從名字上看大概已經猜到作用,這個接口是在.NET Standard 2.1作為標準支持。那這個接口的實際使用場和作用是什么?在了解之前先看一下System.Text.Json的一些代碼:
public?sealed?class?Utf8JsonWriter?:?IAsyncDisposable,?IDisposable {public?Utf8JsonWriter(IBufferWriter<byte>?bufferWriter,?JsonWriterOptions?options?=?default);??public?Utf8JsonWriter(Stream?utf8Json,?JsonWriterOptions?options?=?default); }以下是.net core針對json序列化的數據寫入對象,有兩個造函數分別是Stream和IBufferWriter<byte>。Stream相信不用介紹了,它是基礎數據流讀寫規范,基本它派生出來的有FileStream,MemoryStream,NetworkStream等等,通過這個讀寫規范的抽象可以在讀寫數據的時候完全不用關心實際的數據源。那為什么要現在要引入IBufferWriter<byte>,它的好處是在那里?
IBufferWriter<byte>
????????在了解它之前需要知道它具體的作用是什么,以下是接口的定義
public?interface?IBufferWriter<T> {void Advance(int count);Memory<T>?GetMemory(int?sizeHint?=?0);Span<T> GetSpan(int sizeHint = 0);}IBufferWriter的行為接口規范很簡單,兩個分配內存空間的方法,和一個確定寫入數據數量的方法。簡單來說使用不管內存分配的,需要的時候從相關方法獲取內存空間,當內存空間操作完成后通過Advance方法告訴給提供。
Stream
????????在對比差別之前先看一下Stream的寫入方法是怎樣的
public?abstract?void?Write(byte[]?buffer,?int?offset,?int?count); public?virtual?void?Write(ReadOnlySpan<byte>?buffer); public?Task?WriteAsync(byte[]?buffer,?int?offset,?int?count); public?virtual?ValueTask?WriteAsync(ReadOnlyMemory<byte>?buffer,?CancellationToken?cancellationToken?=?default); public virtual void WriteByte(byte value);以上是Stream寫入數據的規范,它提供了一系列針對Bytes的寫入操作。
兩者的差別
????????通過兩者的提供的方法,否能了解Streram和IBufferWriter的差別?其實兩者的功能都是數據寫入,Stream規范了數據寫入方式,但無法給外部分配內存;而IBufferWriter則規范了對外的分配內存,但并沒有規范數據寫入方式。
????????顯然Stream在寫入上更規范,但為什么還要定義IBufferWriter?其實一切都是為了性能!由于Stream給外部申請內存空間,就意味著所有的寫入行為都是對參數buffer一個拷貝;而IBufferWriter則有所不同,它只管理空間分配和最終提交數量,在寫的過程中并不管控處理,使用者在獲取分配的空間后即可直接操作。
使用
? ? ? ? 既然這個規范是為了提高性能,而dotnet core的組件又開始支持,所以Beetlex在計劃的版本中也相應支持
以上是System.Text.Json使用BeetleX PipeStream基于IBufferWrite的擴展,其實原理是JsonSerializer從IBufferWriter中獲取一小塊內存,寫滿后提交然后再次申請寫入,直到整個對象的序列化完成。
總結
以上是生活随笔為你收集整理的数据写入规则IBufferWriterT的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么时候我们应谈及性能?
- 下一篇: C# ObservableCollect