2013-04-28 54 views
0

我正在使用ARM設備上的實時應用程序。性能很重要,所以我使用了一個通用的ObjectPool類。是否可以調整通用對象池的大小?

到目前爲止,我會預先分配池的最大尺寸,我可以預期,但現在我遇到的情況下,我絕對必須調整池的大小。

查看了許多圍繞Web和SO的解決方案後,我注意到調整大小始終是觸發GC的Array-copying操作。我認爲這是好的,但現在開始看到重要的表現。

是否有真正的可調整大小的對象池解決方案/模式生成零垃圾?

+1

如果您絕對必須有零垃圾,ObjectPool實例的鏈接列表或樹可能工作。不過,您可能會失去任何實時保證。 (至少找到一個實例可以成爲線性或對數時間操作。)「調整」一個數組的大小隻是創建一個新的數組(要求最終收集一箇舊數組),而一個典型的數據庫將在其核心一個實例引用的數組...所以你會想創建一個新的池,而不是調整現有的一個。 – cHao 2013-04-28 23:19:56

回答

0

我會編寫一個內部使用鏈接列表的對象池。這可以讓你的游泳池增長得儘可能的大。池應該添加並從該鏈表開始移除。這反過來又會保證當壓力很低時,相同的物體將被重新使用。

另一方面,正在構建和/或拆除這些物體昂貴嗎?因爲首先使用池的一個原因是管理創建和銷燬昂貴的對象。

使用池的另一個關鍵原因是重用對象,您幾乎總是從池中獲取第一個對象,並希望這些對象在cpu緩存中可用。游泳池中物體耗盡的事實表明,游泳池不會讓您受益匪淺。

所以我的建議是在你開始編寫一個新的對象池之前,也許你應該嘗試放下這個池,看看當你讓GC做它的魔法時,這會如何影響性能。

+0

好奇你做了什麼。使用鏈表或者是否放棄了池? – 2013-05-03 07:41:44

相關問題