成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析池化對象 RecyclableMemoryStream 在 .netcore 中的使用

開發 前端
這篇文章我們將會討論 Microsoft.IO.RecyclableMemoryStream 及如何在 .NET Core 應用程序中提升性能。

[[385657]]

 本文轉載自微信公眾號「碼農讀書」,作者碼農讀書。轉載本文請聯系碼農讀書公眾號。

Microsoft.IO.RecyclableMemoryStream 是一個被設計為專門用于提高 Stream 操作的高性能類庫,意思很明顯,專用于取代 MemoryStream 而生,RecyclableMemoryStream 可以最大限度的避免 Stream 操作在 GC 上的 LOH (大對象堆)的分配和內存碎片,泄露等煩人的問題,這篇文章我們將會討論 Microsoft.IO.RecyclableMemoryStream 及如何在 .NET Core 應用程序中提升性能。

RecyclableMemoryStream 的價值

RecyclableMemoryStream 大體上提供了如下四點價值。

  • 使用緩沖池避免 LOH 分配。
  • 大大的減少生成到2代堆的可能,相對減少了 GC 回收時造成的線程停滯時間。
  • 避免了內存碎片和內存泄漏。
  • 提供了用于跟蹤和分析性能的度量值。

RecyclableMemoryStream 的原理

RecyclableMemoryStream 在2代堆上存儲了一個用于流的大型緩沖區,并能夠確保這個緩沖區在進程的生命周期內一直存在,這就確保了GC不會頻繁的出現全量回收,同時 RecyclableMemoryStreamManager 類維護了兩類緩沖池。

  • 小型緩沖池 常用于讀寫操作,每一個小池子大小為 128k。
  • 大型緩沖池 常用于當有連續緩沖的場景下使用,每一個大池子大小為 1MB。

值得注意的是,大型緩沖池的擴容又分為 線性增長 和 指數型增長,可以看出內存可被高效的反復使用并且對調用者還是無感知的,這就是為什么 RecyclableMemoryStream 比 MemoryStream 更好更高效的原因。

當調用 GetBuffer() 方法時,小緩沖區將會轉換為一個大的連續緩沖區,如下代碼所示:

  1. var buffer = recyclableMemoryStreamManager.GetStream().GetBuffer(); 

安裝 RecyclableMemoryStream

你可以通過 Nuget 可視化界面安裝 Microsoft.IO.RecyclableMemoryStream 或者通過 NuGet package manager console window 執行如下命令。

  1. Install-Package Microsoft.IO.RecyclableMemoryStream 

使用 RecyclableMemoryStream

安裝好之后,接下來我們通過 RecyclableMemoryStream 將數據寫入到 MemoryStream 中,值得注意的是,RecyclableMemoryStreamManager.GetStream() 方法返回的是 MemoryStream 實例。

  1. class Program 
  2.  { 
  3.      private static readonly RecyclableMemoryStreamManager recyclableMemoryStreamManager = new RecyclableMemoryStreamManager(); 
  4.  
  5.      static void Main(string[] args) 
  6.      { 
  7.          string data = "This is a sample text message."
  8.  
  9.          var buffer = Encoding.ASCII.GetBytes(data); 
  10.           
  11.          using (var memoryStream = recyclableMemoryStreamManager.GetStream()) 
  12.          { 
  13.              memoryStream.Write(buffer, 0, buffer.Length); 
  14.          } 
  15.           
  16.          Console.ReadKey(); 
  17.      } 
  18.  } 

上面的代碼還有一點要注意,我將 RecyclableMemoryStreamManager 靜態化了,意味著它只需要定義一次就ok了,還有一點你可以對 MemoryStream 進行標記,方便后續持續跟蹤,如下代碼所示:

  1. using (var memoryStream = recyclableMemoryStreamManager.GetStream("High_Performance_Stream_Demo.Program.Main")) 
  2.             { 
  3.                 memoryStream.Write(buffer, 0, buffer.Length); 
  4.             } 

對 MemoryStream Pool 精細化配置

如果你想對 MemoryStream Pool 做更精細化的配置,可以在 RecyclableMemoryStreamManager 實例上進行配置,如下代碼所示:

  1. int blockSize = 1024; 
  2. int largeBufferMultiple = 1024 * 1024; 
  3. int maximumBufferSize = 16 * largeBufferMultiple; 
  4. int maximumFreeLargePoolBytes = maximumBufferSize * 4; 
  5. int maximumFreeSmallPoolBytes = 250 * blockSize; 
  6. var recyclableMemoryStreamManager = new RecyclableMemoryStreamManager(blockSize, largeBufferMultiple, maximumBufferSize); 
  7. recyclableMemoryStreamManager.AggressiveBufferReturn = true
  8. recyclableMemoryStreamManager.GenerateCallStacks = true
  9. recyclableMemoryStreamManager.MaximumFreeLargePoolBytes = maximumFreeLargePoolBytes; 
  10. recyclableMemoryStreamManager.MaximumFreeSmallPoolBytes = maximumFreeSmallPoolBytes; 

RecyclableMemoryStream 最佳實踐

內存碎片會影響到程序的性能,而且LOH獨有的鏈式管理也非常容易產生內存碎片,下面是使用 RecyclableMemoryStream 應該遵循的一些經驗法則。

  • 根據你的業務場景設置合適的 blockSize, largeBufferMultiple, maxBufferSize, MaximumFreeLargePoolBytes, MaximumFreeSmallPoolBytes 值。
  • 當使用完 Stream 對象時一定要速速關閉。
  • 永遠不要調用 ToArray() 方法。
  • 盡可能避免調用 GetBuffer() 方法。

Microsoft.IO.RecyclableMemoryStream 是 MemoryStream 的池化對象,它技巧性的減少了 GC 的負載并減少了 LOH 的大對象分配,自然就提高了應用程序的性能,不僅避免了內存碎片和內存泄漏還提供了用于跟蹤性能的指標。

譯文鏈接:https://www.infoworld.com/article/3597060/how-to-use-recyclablememorystream-in-net-core.html

責任編輯:武曉燕 來源: 碼農讀書
相關推薦

2009-07-01 09:17:36

對象比較Java

2009-06-16 15:20:48

ApplicationJSP程序

2017-05-24 09:43:42

2009-09-29 16:11:45

Hibernate實現

2011-08-29 17:27:47

HTML 5交互移動應用

2009-09-11 11:33:58

C# WinForm控Attribute

2009-09-28 13:23:54

HTTP編程

2010-03-15 17:17:29

Java線程池

2009-08-25 15:15:08

C#對象序列化應用

2023-10-10 10:02:32

2021-07-27 22:56:00

JavaScript編程開發

2021-07-15 08:58:16

Spring對象引用

2012-06-13 09:29:28

2011-03-11 09:20:35

jQueryjavascript

2009-07-29 15:55:48

ASP.NET Req

2011-09-27 09:50:46

軟件項目管理

2011-06-19 08:59:59

錨文本

2009-07-08 15:31:40

JDK 6.0web service

2012-07-11 14:31:16

SpringAop

2009-09-09 14:45:41

XML序列化和反序列化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av在线免费观看网站 | 亚洲精品一区二区三区在线观看 | 亚洲精品1区 | 久久精彩| 国产一区在线免费观看视频 | 亚洲色图在线观看 | 日韩1区2区 | 一区二区三区四区国产 | 国产精品美女久久久久久免费 | 午夜无码国产理论在线 | 国产乱码久久久久久一区二区 | 久久久av | 无码一区二区三区视频 | 日日操视频| 91视频一区二区三区 | 成人精品久久 | 91在线第一页 | 黄色av网站在线观看 | 永久www成人看片 | 成年人在线视频 | 国产精品免费一区二区三区四区 | 欧美日韩精品一区二区三区视频 | 午夜视频在线观看视频 | 日日天天 | 91视视频在线观看入口直接观看 | 欧美一区二区三区在线观看视频 | 成人在线电影在线观看 | 亚洲精品一区二区三区中文字幕 | 日日干干 | 一区二区三区四区av | 99免费在线视频 | 日本三级电影免费 | 鲁视频 | 日日干干| 青青草视频网 | 中文字幕在线免费视频 | 成人三级网址 | 毛片区 | 天天色综网 | 国产精品毛片无码 | 欧美老少妇一级特黄一片 |