.Net Core中的ObjectPool

1、對象池  

  運用對象池化技術能夠顯著地提高性能,尤爲是當對象的初始化過程代價較大或者頻率較高。下面是ObjectPool源碼中涉及的幾個類。當你看過.Net Core源碼不少時,你會發現,微軟的開發不少都是這種模式,經過Policy構建Provider,經過Provider建立最終的類。數組

2、使用

  這個組件的目的主要是將對象保存到對象池,用的時候直接去取,不須要從新建立,實現對象的重複利用。可是有個問題,假如對象池中開始沒有對象或者取得數量大於對象池中的數量怎麼辦?在對象池中對象的數量不足時,此時來取對象,須要經過Policy建立對象,至於怎麼建立對象,是你須要實現的。Policy如上圖,有個默認實現  DefaultPooledObjectPolicy ,它的建立就是 new T().app

DefaultObjectPool<User> defaultPool = new DefaultObjectPool<User>(new DefaultPooledObjectPolicy<User>(), 2);

            var firstUser=defaultPool.Get();//從對象池中取一個對象,此時對象池中尚未對象,返回 Age=0 Name=null

            var user1 = new User()
            {
                Age = 18,
                Name = "MicroHeart"
            };

            var user2 = new User()
            {
                Age = 19,
                Name = "MicroHeart"
            };

            var user3 = new User()
            {
                Age = 20,
                Name = "MicroHeart"
            };

            defaultPool.Return(user1);//將對象放回對象池中,可是不必定成功。對象池有數量限制,並且也能夠自定義限制,讓一些對象不能放入對象池中
            defaultPool.Return(user2);
            defaultPool.Return(user3);

            var u1 = defaultPool.Get();//從對象池中取一個對象,返回第一個放入的user1
            var u2 = defaultPool.Get();//從對象池中取一個對象,返回第二個放入的user2
            var u3 = defaultPool.Get();//此時對象池中沒有對象了,獲取對象調用的Policy的Create方法,DefaultPooledObjectPolicy的Create方法的實現是:new T(),因此返回 Age=0 Name=null

上面例子當對象池中沒有對象是,調取獲取方法,其實就是new T()。下面在對象中添加3個對象,可是對象池中只有2個空間,因此第三個是添加不進去的。ide

 

如今本身建立一個的Policy性能

    public class MyUserPolicy : PooledObjectPolicy<User>//須要繼承抽象類
    {
        public override User Create()
        {
            return new User()
            {
                Age = 18,
                Name = "MicroHeart"
            };
        }

        public override bool Return(User user)
        {
            if (user.Age == 18)
                return false;
            return true;
        }
    }
            DefaultObjectPool<User> defaultPool = new DefaultObjectPool<User>(new MyUserPolicy(), 2);

            var firstUser=defaultPool.Get();//返回 Age=0 Name=null

            var user1 = new User()
            {
                Age = 18,
                Name = "MicroHeart"
            };

            var user2 = new User()
            {
                Age = 19,
                Name = "MicroHeart"
            };

            var user3 = new User()
            {
                Age = 20,
                Name = "MicroHeart"
            };

            defaultPool.Return(user1);
            defaultPool.Return(user2);
            defaultPool.Return(user3);

            var u1 = defaultPool.Get();//返回user2  由於user1的Age=18,policy中Reture篩選條件 返回false,致使第一個user不能放入鏈接池中。
            var u2 = defaultPool.Get();//返回user3
            var u3 = defaultPool.Get();//返回 Age=18 Name=MicroHeart 這個是使用 Policy中的Create建立

3、源碼解析

 IPooledObjectPolicy<T>:  主要做用是建立對象和將對象放入鏈接池中spa

  Create:定義一個建立對象的方法,當鏈接池中的數量不夠取的時候,經過此方法建立對象。code

  Return:將對象放入鏈接池中,若是放入成功,返回Ture.不然返回False.
  DefaultPooledObjectPolicy<T>:繼承抽象類PooledObjectPolicy<T>,而抽抽象類繼承接口 IPooledObjectPolicy<T>。Policy的默認實現類對象

    Create:定義一個默認建立對象的方法 new T();blog

    Return:不管是否放入鏈接池,所有返回True.繼承

ObjectPoolProvider:建立對象池(ObjectPool)接口

  abstract ObjectPool<T> Create<T>(IPooledObjectPolicy<T> policy):經過Policy建立ObjectPool

  DefaultObjectPoolProvider:ObjectPoolProvider的默認實現類

    ObjectPool<T> Create<T>(IPooledObjectPolicy<T> policy) :建立一個能夠容納處理器數量X2的對象池。

ObjectPool<T>:對象池

  T Get():從對象池中獲取對象。

  void Return(T obj):將對象放入對象池中。

  DefaultObjectPool:對象池的默認實現類,它實現了Get和Return方法。其實對象池的本質就是它的中的 ObjectWrapper[] _items; ,當使用Return方法是,將對象放入 ObjectWrapper數組中。Get方法從數組中取。

相關文章
相關標籤/搜索