最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET?Core?中對(duì)象池?Object?Pool的使用

 更新時(shí)間:2021年11月22日 12:52:32   作者:494324190  
這篇文章主要介紹了?.NET?Core?中對(duì)象池?Object?Pool的使用,對(duì)象池簡(jiǎn)單來說就是一種為對(duì)象提供可復(fù)用能力的軟件設(shè)計(jì)思路,對(duì)象池最常用的場(chǎng)景是游戲設(shè)計(jì),因?yàn)樵谟螒蛑写罅看嬖谥蓮?fù)用的對(duì)象,源源不斷的子彈出現(xiàn)并不是循環(huán)再生的,下面一起進(jìn)入文章了解具體內(nèi)容吧

一、什么是對(duì)象池

對(duì)象池簡(jiǎn)單來說就是一種為對(duì)象提供可復(fù)用能力的軟件設(shè)計(jì)思路。我們常說有借有還,再借不難,而對(duì)象池就是通過借和還這樣兩個(gè)動(dòng)作來保證對(duì)象可以被重復(fù)使用,從而節(jié)省頻繁創(chuàng)建對(duì)象的性能開銷。對(duì)象池最常用的場(chǎng)景是游戲設(shè)計(jì),因?yàn)樵谟螒蛑写罅看嬖谥蓮?fù)用的對(duì)象,源源不斷的子彈出現(xiàn)并不是循環(huán)再生的。在數(shù)據(jù)庫(kù)中存在著被稱為連接池的東西,每當(dāng)出現(xiàn)數(shù)據(jù)庫(kù)無法連接的情況時(shí),經(jīng)驗(yàn)豐富的開發(fā)人員往往會(huì)先檢查連接池是否滿了,這其實(shí)就是對(duì)象池模式在特定領(lǐng)域的具體實(shí)現(xiàn)。因此對(duì)象池本質(zhì)上就是負(fù)責(zé)一組對(duì)象創(chuàng)建和銷毀的容器。 對(duì)象池最大的優(yōu)勢(shì)是可以自主地管理池子內(nèi)的每個(gè)對(duì)象,決定它們是需要被回收還是可以重復(fù)使用。我們都知道創(chuàng)建一個(gè)新對(duì)象需要消耗一定的系統(tǒng)資源,一旦這些對(duì)象可以重復(fù)地使用就可以節(jié)省系統(tǒng)資源開銷,這對(duì)提高系統(tǒng)性能會(huì)非常有幫助。下面的代碼實(shí)微軟官方文檔實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的對(duì)象池:


public class ObjectPool<T> : IObjectPool<T>

{

	private Func<T> _instanceFactory;

	private ConcurrentBag<T> _instanceItems;

	public ObjectPool(Func<T> instanceFactory)

	{

		_instanceFactory = instanceFactory ?? 

		throw new ArgumentNullException(nameof(instanceFactory));

		_instanceItems = new ConcurrentBag<T>();

	}

	public T Get()

	{

		T item;

		if (_instanceItems.TryTake(out item)) return item;

		return _instanceFactory();

	}

	public void Return(T item)

	{

		_instanceItems.Add(item);

	}

}

二、.NET Core 中的對(duì)象池

.NET Core 中微軟已經(jīng)為我們提供了對(duì)象池的實(shí)現(xiàn),即Microsoft.Extensions.ObjectPool。它主要提供了三個(gè)核心的組件,分別是ObjectPoolObjectPoolProviderIPooledObjectPolicy。ObjectPool是一個(gè)抽象類,對(duì)外提供了Get和Return兩個(gè)方法,這就是所謂的有借有還。ObjectPoolProvider同樣是一個(gè)抽象類,它的職責(zé)就是創(chuàng)建ObjectPool,它提供了兩個(gè)Create方法,兩者的區(qū)別是無參數(shù)版本本質(zhì)上使用的是DefaultPooledObjectPolicy。它和DefaultObjectPool、DefaultObjectPoolProvider都是微軟提供的默認(rèn)實(shí)現(xiàn),IPooledObjectPolicy可以為不同的對(duì)象池定義不同的策略,來決定對(duì)象如何借、是否可以還。DefaultObjectPool內(nèi)部使用ObjectWrapper[]來管理對(duì)象,ObjectWrapper[]的大小等于 maximumRetained-1,默認(rèn)情況下maximumRetained等于Environment.ProcessorCount * 2,這里主要用到了Interlocked.CompareExchange()方法,

具體代碼如下:

public override T Get()

{

  var item = _firstItem;

  if (item == null || Interlocked.CompareExchange(ref _firstItem, null, item) != item)

  {

    var items = _items;

    for (var i = 0; i < items.Length; i++)

    {

      item = items[i].Element;

      if (item != null && Interlocked.CompareExchange(ref items[i].Element, null, item) == item)

      {

        return item;

      }

    }

    item = Create();

  }

  return item;

}

// Non-inline to improve its code quality as uncommon path

[MethodImpl(MethodImplOptions.NoInlining)]

private T Create() => _fastPolicy?.Create() ?? _policy.Create();



public override void Return(T obj)

{

  if (_isDefaultPolicy || (_fastPolicy?.Return(obj) ?? _policy.Return(obj)))

  {

    if (_firstItem != null || Interlocked.CompareExchange(ref _firstItem, obj, null) != null)

    {

      var items = _items;

      for (var i = 0; i < items.Length && Interlocked.CompareExchange(ref items[i].Element, obj, null) != null; ++i)

      {

      }

    }

  }

}

這里用到Interlocked.CompareExchange()方法,Get()方法將items[i].Elementnull進(jìn)行交換,將指定元素設(shè)為 null 并返回原始值。Return()方法將items[i].Element和obj交換后的值不為 null,表示指定元素已經(jīng)歸還,這個(gè)方法只有在第一個(gè)參數(shù)和第三個(gè)參數(shù)相等時(shí)才會(huì)發(fā)生交換。

說了這么多,我們來看一下對(duì)象池具體的用法:

var service = new ServiceCollection();

//使用DefaultObjectPoolProvider

service.AddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();

//使用默認(rèn)策略

service.AddSingleton<ObjectPool<Foo>>(serviceProvider =>

{

  var objectPoolProvider = serviceProvider.GetRequiredService<ObjectPoolProvider>();

  return objectPoolProvider.Create<Foo>();

});

//使用自定義策略

service.AddSingleton<ObjectPool<Foo>>(serviceProvider =>

{

  var objectPoolProvider = serviceProvider.GetRequiredService<ObjectPoolProvider>();

  return objectPoolProvider.Create(new FooObjectPoolPolicy());

});



var serviceProvider = _service.BuildServiceProvider();



var objectPool = _serviceProvider.GetService<ObjectPool<Foo>>();



//有借有還,兩次是同一個(gè)對(duì)象

var item1 = objectPool.Get();

objectPool.Return(item1);

var item2 = objectPool.Get();

Assert.AreEqual(item1, item2);//true



//有借無還,兩次是不同的對(duì)象

var item3 = objectPool.Get();

var item4 = objectPool.Get();

Assert.AreEqual(item3, item4);//false

上面的代碼中Foo和FooObjectPoolPolicy是兩個(gè)工具類:

public class Foo

{

  public string Id { get; set; }

  public DateTime? CreatedAt { get; set; }

  public string CreatedBy { get; set; }

}



public class FooObjectPoolPolicy : IPooledObjectPolicy<Foo>

{

  public Foo Create()

  {

    return new Foo()

    {

      Id = Guid.NewGuid().ToString("N"),

      CreatedAt = DateTime.Now,

      CreatedBy = "zs"

    };

  }



  public bool Return(Foo obj)

  {

    return true;

  }

}

TIP:當(dāng)你需要控制對(duì)象池內(nèi)的對(duì)象如何被創(chuàng)建的時(shí)候,你可以考慮實(shí)現(xiàn)自定義的IPooledObjectPolicy<T>,反之DefaultPooledObjectPolicy<T>實(shí)現(xiàn)完全可以滿足你的使用。

三、本文小結(jié)

實(shí)現(xiàn)對(duì)象池可以考慮ConcurrentBag、Stack、Queue以及BlockingCollection等多種數(shù)據(jù)結(jié)構(gòu),而微軟在.NET Core 中已經(jīng)為我們實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的對(duì)象池,大多數(shù)情況下,我們只需要定義自己的IPooledObjectPolicy去決定對(duì)象應(yīng)該怎么樣借、怎么樣還??傊螒蚴澜缋锏?GameObject、數(shù)據(jù)庫(kù)里的連接池,都是對(duì)象池模式在各自領(lǐng)域中的具體實(shí)現(xiàn)。

TIP:對(duì)象池是一種通過復(fù)用對(duì)象來減少資源開銷進(jìn)而實(shí)現(xiàn)提高系統(tǒng)性能的軟件設(shè)計(jì)模式,其核心是控制容器內(nèi)對(duì)象的生命周期來規(guī)避系統(tǒng)的主動(dòng)回收,從對(duì)象池中借出的對(duì)象必須要及時(shí)歸還,否則會(huì)造成對(duì)象池中沒有可用資源。

到此這篇關(guān)于 .NET Core 中對(duì)象池 Object Pool的使用的文章就介紹到這了,更多相關(guān) .NET Core 中對(duì)象池 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • ASP.NET?Core使用功能開關(guān)控制路由訪問操作(續(xù))

    ASP.NET?Core使用功能開關(guān)控制路由訪問操作(續(xù))

    這篇文章主要介紹了ASP.NET?Core使用功能開關(guān)控制路由訪問操作的(續(xù)),上一篇文章我們已經(jīng)介紹過一部份該相關(guān)內(nèi)容,??在本文,我們可以判斷當(dāng)前路由地址是否為調(diào)試地址,讓評(píng)估返回真,需要的小伙伴可以參考一下
    2022-02-02
  • .Net 6中的PeriodTimer介紹

    .Net 6中的PeriodTimer介紹

    這篇文章主要介紹了.Net 6中的PeriodTimer,.net 6中新增了一個(gè)異步計(jì)時(shí)器PeroidTimer,相對(duì)普通Timer的回調(diào), 它的模型更簡(jiǎn)單,下面一起來看看具體詳情吧
    2022-01-01
  • .net中線程同步的典型場(chǎng)景和問題剖析

    .net中線程同步的典型場(chǎng)景和問題剖析

    在使用多線程進(jìn)行編程時(shí),有一些經(jīng)典的線程同步問題,對(duì)于這些問題,.net提供了多種不同的類來解決
    2012-11-11
  • ASP.NET webUploader上傳大視頻文件相關(guān)web.config配置

    ASP.NET webUploader上傳大視頻文件相關(guān)web.config配置

    本文主要介紹了webUploader上傳大視頻文件相關(guān)web.config的配置。具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • .Net Framework .Net  .NET Standard的概念及區(qū)別

    .Net Framework .Net .NET Standard的概念及區(qū)別

    這篇文章主要介紹了.Net Framework .Net .NET Standard的概念及區(qū)別,需要的朋友可以參考下
    2021-08-08
  • asp.net 獲取數(shù)據(jù)庫(kù)連接字符串

    asp.net 獲取數(shù)據(jù)庫(kù)連接字符串

    本文主要介紹了asp.net獲取數(shù)據(jù)庫(kù)連接字符串的具體實(shí)現(xiàn)代碼,具有一定參考價(jià)值,需要的朋友可以看下
    2016-12-12
  • .Net性能調(diào)優(yōu)-ArrayPool詳情

    .Net性能調(diào)優(yōu)-ArrayPool詳情

    ArrayPool具有高性能 托管 數(shù)組緩沖池,可重復(fù)使用,用 租用 空間的方式代替 重新分配 數(shù)組空間的行為的特點(diǎn)及可以在頻繁創(chuàng)建和銷毀數(shù)組的情況下 提高性能 ,減少垃圾回收器的壓力的優(yōu)點(diǎn),下面文章內(nèi)容將詳細(xì)對(duì)其做介紹,需要的朋友可以參考一下
    2021-09-09
  • 認(rèn)識(shí)ASP.NET配置文件Web.config

    認(rèn)識(shí)ASP.NET配置文件Web.config

    Web.config文件是一個(gè)XML文本文件,它用來儲(chǔ)存 ASP.NET Web 應(yīng)用程序的配置信息(如最常用的設(shè)置ASP.NET Web 應(yīng)用程序的身份驗(yàn)證方式),它可以出現(xiàn)在應(yīng)用程序的每一個(gè)目錄中
    2006-07-07
  • .NET 6 即將到來的新特性  隱式命名空間引用

    .NET 6 即將到來的新特性 隱式命名空間引用

    ASP.NET 現(xiàn)在我們還是需要手動(dòng)加命名空間引用,在以后的版本中可能就不需要手動(dòng)加命名空間的引用了,本文就來介紹.NET 6即將到來的新特性--隱式命名空間引用,,需要的朋友可以參考下面文章內(nèi)容
    2021-09-09
  • .NET6新特性之 隱式命名空間引用

    .NET6新特性之 隱式命名空間引用

    本文給大家分享的是 .NET6特新 隱式命名空間引用,如果我們要在新加一個(gè)命名空間的引用,可以在項(xiàng)目文件中配置增加<Using Include="命名空間"/>,如果需要移除一個(gè)命名空間可以這么做<Using Remove="命名空間"/>,下面來看看文章詳細(xì)介紹內(nèi)容吧,需要的朋友可以參考一下
    2021-11-11

最新評(píng)論

山东省| 镇巴县| 洛宁县| 临泉县| 河北区| 章丘市| 达孜县| 哈尔滨市| 固原市| 洛扎县| 仙游县| 新田县| 岑巩县| 双城市| 潍坊市| 洪江市| 柘城县| 义马市| 兰溪市| 郸城县| 通化县| 黑山县| 信丰县| 宁都县| 姜堰市| 辉南县| 永靖县| 凤山县| 黄浦区| 丹棱县| 铁力市| 民乐县| 甘孜县| 昌乐县| 阿克陶县| 区。| 成武县| 乐都县| 延津县| 上思县| 元朗区|