您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何池化.NET內存流以解決大內存堆分配問題,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
與很多依賴于標記-清理的垃圾回收器的語言一樣,C#也會在頻繁分配內存或分配大塊內存時產生性能問題。微軟必應的高級軟件開發工程師Ben Watson,就曾在使用MemoryStream類的時候遇到了這種問題。在他的Writing High-Performance .NET Code一書中,他寫道,
在某個飽受大量LOH(大對象堆)分配之苦的應用中,我們發現如果將某種類型的對象保存在池中,就能解決99%的LOH問題。這個對象就是我們在網絡中序列化和傳輸位的MemoryStream。為了避免碎片,我們保存了一個MemoryStream對象的隊列,盡管實際實現要復雜得多,但理論上來說基本如此。每次MemoryStram對象釋放的時候,就將其放回池中以供復用。
在此之后微軟將他的代碼放到了Microsoft.IO.RecycableMemoryStream
類中。該類是傳統的內存流的代替品。在最簡單的情況下,可以用manager.GetStream
代替new MemoryStream
。
注意這個流管理器是線程安全的,并且應該在進程中一直使用。
《華盛頓郵報》作者Ben Watson說,這個工具被優化后要執行如下部分:
利用合并的緩沖區消除大對象堆分配
避免內存泄漏,線程池擁有邊界
避免內存碎片
提供出色的可調試性
提供性能指標跟蹤
關于如何池化.NET內存流以解決大內存堆分配問題就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。