物件池Pools優化

2021-09-19 18:11:24 字數 3671 閱讀 9454

目錄介紹

04.glide物件池總結

05.學以致用物件池

06.物件池的容量

如果覺得好,可以star一下,謝謝!當然也歡迎提出建議,萬事起於忽微,量變引起質變!

物件池使用場景

3.1 多條件key建立

private final mapcache = new hashmap<>()

private void setimage(imageview iv, string name)

iv.setimagebitmap(b);

}

多條件 key

注意多條件key需要重寫equals和hashcode方法。equals注意是比較兩個物件是否相同,而hashcode主要作用是當資料量很大的時候,使用equals一一比較比較會大大降低效率。hashcode實際上是返回物件的儲存位址,如果這個位置上沒有元素,就把元素直接儲存在上面,如果這個位置上已經存在元素,這個時候才去呼叫equal方法與新元素進行比較就可以提高效率呢!

private final mapcache = new hashmap<>();

private void setimage(imageview iv, string name, int width, int height)

iv.setimagebitmap(b);

}public class key

public string getname()

public int getwidth()

public int getheifht()

@override

public boolean equals(object o)

if (o == null || getclass() != o.getclass())

key key = (key) o;

if (width != key.width)

if (heifht != key.heifht)

return name != null ? name.equals(key.name) : key.name == null;

}@override

public int hashcode()

}

3.2 key值的復用

@override

@nonnull

public bitmap get(int width, int height, bitmap.config config) else

return result;

} @nullable

private synchronized bitmap getdirtyornull(

int width, int height, @nullable bitmap.config config)

misses++;

} else

if (log.isloggable(tag, log.verbose))

dump();

return result;

}

然後看一下sizeconfigstrategy類中的get方法

@override

@nullable

public bitmap get(int width, int height, bitmap.config config)

return result;

} private key findbestkey(int size, bitmap.config config)

break;}}

return result;

} @visiblefortesting

static class keypool extends basekeypool

@override

protected key create()

}

然後看一下groupedmap的**

@nullable

public v get(k key) else

makehead(entry);

return entry.removelast();

}

為何要多條件key

hashmap中鍵儲存問題

5.1 使用場景

5.2 實現步驟

/**

** @author yangchong

* blog :

* time : 2017/05/30

* desc : 物件池抽象類

* revise: 具體使用方法請看:/ycgallery

*

*/

public abstract class objectspool

/*** 獲取乙個空閒的物件

** 如果物件池為空,則物件池自己會new乙個返回.

* 如果物件池內有物件,則取乙個已存在的返回.

* take出來的物件用完要記得呼叫given歸還.

* 如果不歸還,讓然會發生記憶體抖動,但不會引起洩漏.

** @return 可用的物件

** @see #given(object)

*/public t take() else

}/**

* 歸還物件池內申請的物件

* 如果歸還的物件數量超過物件池容量,那麼歸還的物件就會被丟棄

** @param obj 歸還的物件

** @see #take()

*/public void given(t obj)

}/**

* 例項化物件

** @return 建立的物件

*/abstract protected t newinstance();

/*** 重置物件

** 把物件資料清空到就像剛建立的一樣.

** @param obj 需要被重置的物件

* @return 被重置之後的物件

*/abstract protected t resetinstance(t obj);

}

然後,可以定義乙個矩陣物件池,需要實現上面的抽象方法。如下所示

public class matrixpool extends objectspool

@override

protected matrix newinstance()

@override

protected matrix resetinstance(matrix obj)

}

5.3 物件池使用

5.4 專案實踐分享

大多數物件的復用,最終實施的方案都是利用物件池技術,要麼是在編寫**的時候顯式的在程式裡面去建立物件池,然後處理好復用的實現邏輯,要麼就是利用系統框架既有的某些復用特性達到減少物件的重複建立,從而減少記憶體的分配與**。

縮放案例:/yczoomimage

使用物件池也是要有一定代價的:短時間內生成了大量的物件佔滿了池子,那麼後續的物件是不能復用的。

01.關於部落格彙總鏈結

02.關於我的部落格

03.參考部落格

物件池Pools優化

目錄介紹 04.glide物件池總結 05.學以致用物件池 06.物件池的容量 如果覺得好,可以star一下,謝謝!當然也歡迎提出建議,萬事起於忽微,量變引起質變!物件池使用場景 3.1 多條件key建立private final mapcache new hashmap private void ...

Unity記憶體優化 物件池

為什麼用物件池?作用 因為mono內存在unity中不能手動釋放,當其記憶體超過上限時,會先觸發gc釋放沒有用到的記憶體空間,如果還不夠則會擴充。其容量一旦被撐大,專案所佔的記憶體就會跟著增大。使用物件池可以減少物件建立,緩解記憶體壓力。物件池示意 這裡通過乙個棧儲存物件 m maxcount 表示...

利用物件池優化資料庫操作

說到物件池,大家都不陌生。很多人都實現過,網上的 也滿天飛。說到連線池,更是誰人不知,哪家不曉。也有不少人自己實現了連線池,試圖對資料訪問進行優化。歸納了一下,比較常見的思路如下 1.資料庫連線的開啟比較耗費資源,如果能避免重複的開關,可以提高效率。2.如果有乙個一直開啟資料庫連線,直到程式結束其生...