.Net Core中ObjectPool的使用與源碼解析
一、對(duì)象池
運(yùn)用對(duì)象池化技術(shù)可以顯著地提升性能,尤其是當(dāng)對(duì)象的初始化過程代價(jià)較大或者頻率較高。下面是ObjectPool源碼中涉及的幾個(gè)類。當(dāng)你看過.Net Core源碼很多時(shí),你會(huì)發(fā)現(xiàn),微軟的開發(fā)很多都是這種模式,通過Policy構(gòu)建Provider,通過Provider創(chuàng)建最終的類。
二、使用
這個(gè)組件的目的主要是將對(duì)象保存到對(duì)象池,用的時(shí)候直接去取,不需要重新創(chuàng)建,實(shí)現(xiàn)對(duì)象的重復(fù)利用。但是有個(gè)問題,假如對(duì)象池中開始沒有對(duì)象或者取得數(shù)量大于對(duì)象池中的數(shù)量怎么辦?在對(duì)象池中對(duì)象的數(shù)量不足時(shí),此時(shí)來取對(duì)象,需要通過Policy創(chuàng)建對(duì)象,至于怎么創(chuàng)建對(duì)象,是你需要實(shí)現(xiàn)的。Policy如上圖,有個(gè)默認(rèn)實(shí)現(xiàn) DefaultPooledObjectPolicy ,它的創(chuàng)建就是 new T().
DefaultObjectPool<User> defaultPool = new DefaultObjectPool<User>(new DefaultPooledObjectPolicy<User>(), 2); var firstUser=defaultPool.Get();//從對(duì)象池中取一個(gè)對(duì)象,此時(shí)對(duì)象池中還沒有對(duì)象,返回 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);//將對(duì)象放回對(duì)象池中,但是不一定成功。對(duì)象池有數(shù)量限制,而且也可以自定義限制,讓一些對(duì)象不能放入對(duì)象池中 defaultPool.Return(user2); defaultPool.Return(user3); var u1 = defaultPool.Get();//從對(duì)象池中取一個(gè)對(duì)象,返回第一個(gè)放入的user1 var u2 = defaultPool.Get();//從對(duì)象池中取一個(gè)對(duì)象,返回第二個(gè)放入的user2 var u3 = defaultPool.Get();//此時(shí)對(duì)象池中沒有對(duì)象了,獲取對(duì)象調(diào)用的Policy的Create方法,而DefaultPooledObjectPolicy的Create方法的實(shí)現(xiàn)是:new T(),所以返回 Age=0 Name=null
上面例子當(dāng)對(duì)象池中沒有對(duì)象是,調(diào)取獲取方法,其實(shí)就是new T()。下面在對(duì)象中添加3個(gè)對(duì)象,但是對(duì)象池中只有2個(gè)空間,所以第三個(gè)是添加不進(jìn)去的。
現(xiàn)在自己創(chuàng)建一個(gè)的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 因?yàn)閡ser1的Age=18,policy中Reture篩選條件 返回false,導(dǎo)致第一個(gè)user不能放入連接池中。 var u2 = defaultPool.Get();//返回user3 var u3 = defaultPool.Get();//返回 Age=18 Name=MicroHeart 這個(gè)是使用 Policy中的Create創(chuàng)建
三、源碼解析
IPooledObjectPolicy<T>: 主要作用是創(chuàng)建對(duì)象和將對(duì)象放入連接池中
Create:定義一個(gè)創(chuàng)建對(duì)象的方法,當(dāng)連接池中的數(shù)量不夠取的時(shí)候,通過此方法創(chuàng)建對(duì)象。
Return:將對(duì)象放入連接池中,如果放入成功,返回Ture.否則返回False.
DefaultPooledObjectPolicy<T>:繼承抽象類PooledObjectPolicy<T>,而抽抽象類繼承接口 IPooledObjectPolicy<T>。Policy的默認(rèn)實(shí)現(xiàn)類
Create:定義一個(gè)默認(rèn)創(chuàng)建對(duì)象的方法 new T();
Return:不論是否放入連接池,全部返回True.
ObjectPoolProvider:創(chuàng)建對(duì)象池(ObjectPool)
abstract ObjectPool<T> Create<T>(IPooledObjectPolicy<T> policy):通過Policy創(chuàng)建ObjectPool
DefaultObjectPoolProvider:ObjectPoolProvider的默認(rèn)實(shí)現(xiàn)類
ObjectPool<T> Create<T>(IPooledObjectPolicy<T> policy) :創(chuàng)建一個(gè)可以容納處理器數(shù)量X2的對(duì)象池。
ObjectPool<T>:對(duì)象池
T Get():從對(duì)象池中獲取對(duì)象。
void Return(T obj):將對(duì)象放入對(duì)象池中。
DefaultObjectPool:對(duì)象池的默認(rèn)實(shí)現(xiàn)類,它實(shí)現(xiàn)了Get和Return方法。其實(shí)對(duì)象池的本質(zhì)就是它的中的 ObjectWrapper[] _items; ,當(dāng)使用Return方法是,將對(duì)象放入 ObjectWrapper數(shù)組中。Get方法從數(shù)組中取。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
ASP.NET中后臺(tái)注冊(cè)js腳本使用的方法對(duì)比
接下來為大家介紹下使用Page.ClientScript.RegisterClientScriptBlock 和Page.ClientScript.RegisterStartupScript:區(qū)別2013-04-04ASP.NET?Core中Razor頁面與MVC區(qū)別介紹
這篇文章介紹了ASP.NET?Core中Razor頁面與MVC的區(qū)別,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02C#實(shí)現(xiàn)HTTP協(xié)議迷你服務(wù)器(兩種方法)
用C#語言實(shí)現(xiàn)HTTP協(xié)議的服務(wù)器類本文將以兩種稍微有差別的方式用C#語言實(shí)現(xiàn);要完成高性能的Web服務(wù)功能,通常都是需要寫入到服務(wù),如IIS,Apache Tomcat感興趣的朋友可以了解下,或許對(duì)你學(xué)習(xí)c#有所幫助2013-02-02通過ASP.net實(shí)現(xiàn)flash對(duì)數(shù)據(jù)庫的訪問
近來網(wǎng)站需要在flash中提取數(shù)據(jù)庫中的數(shù)據(jù),從網(wǎng)上找了一點(diǎn)資料,今天下午在自己的機(jī)器上實(shí)現(xiàn)了一下,還是比較簡(jiǎn)單的。2009-08-08linq to sql中,如何解決多條件查詢問題,答案,用表達(dá)式樹!
有個(gè)小項(xiàng)目中,用到了linq to sql,既然這樣,想必需要做多條件組合查詢了,雖然我對(duì)表達(dá)式樹的研究也只是寥寥地,但除此方法,似乎別無他法,只好硬著頭皮研究一下.2011-08-08FileUpload1 上傳文件類型驗(yàn)證正則表達(dá)式
FileUpload1 上傳文件類型驗(yàn)證正則表達(dá)式...2006-10-10關(guān)于WPF使用MultiConverter控制Button狀態(tài)的詳細(xì)介紹
本篇文章小編將為大家介紹,關(guān)于WPF使用MultiConverter控制Button狀態(tài)的詳細(xì)介紹。需要的朋友參考下2013-04-04ASP.NET網(wǎng)站實(shí)時(shí)顯示時(shí)間的方法
這篇文章主要介紹了ASP.NET網(wǎng)站實(shí)時(shí)顯示時(shí)間的方法,主要通過AJAX控件來實(shí)現(xiàn)該功能,是非常具有實(shí)用價(jià)值的技巧,需要的朋友可以參考下2014-11-11