2011-03-13 101 views
3

最近我發現了Boos Pool庫,並開始將它調整爲我的代碼。圖書館提到它缺少的一件事是基類,它將覆蓋任何類的新/刪除操作符,並使用該池進行內存管理。我寫了自己的實現和一些元模板編程,實際上它看起來非常體面(通過簡單地從基類派生,支持大小在1到1024個字節之間的任何類)Boost Pool free效率O(n)or O(1)

我提到那些因爲目前爲止這真的很酷,令人興奮,然後我發現這個post from Boost mailing list。看起來有些人確實錘擊了Pool庫,特別指出他們所說的free()方法在O(n)時間運行的低效性。我通過代碼加強,並發現這是方法的實現:

void free(void * const chunk) 
{ 
    nextof(chunk) = first; 
    first = chunk; 
} 

對我來說,這看起來像O(1),我真的不明白他們在說什麼的低效率。我注意到的一件事是,如果你使用singleton_pool的多個實例(即不同的標籤和/或分配大小),它們都共享相同的互斥量(關鍵部分更精確),這可以進行一些優化。但是如果你使用常規的堆操作,他們會使用相同的同步形式。

那麼沒有人認爲池庫效率低下和過時?

+0

什麼nextof(無效*)的實施? –

+0

像往常一樣,擁有一個互斥或多個互斥是一種折衷。如果你擁有** lot **池,你會得到一種內存碎片,因爲它們保持自己的記憶。 –

+0

@Null nextof(...)是一個單線程reinterpret_cast – DXM

回答

5

這自由肯定對我來說看起來不變。也許帖子的作者指的是ordered_free,其中有這樣實現:

void ordered_free(void * const chunk) 
{ 
    // This (slower) implementation of 'free' places the memory 
    // back in the list in its proper order. 

    // Find where "chunk" goes in the free list 
    void * const loc = find_prev(chunk); 

    // Place either at beginning or in middle/end 
    if (loc == 0) 
    (free)(chunk); 
    else 
    { 
    nextof(chunk) = nextof(loc); 
    nextof(loc) = chunk; 
    } 
} 

哪裏find_prev如下

template <typename SizeType> 
void * simple_segregated_storage<SizeType>::find_prev(void * const ptr) 
{ 
    // Handle border case 
    if (first == 0 || std::greater<void *>()(first, ptr)) 
    return 0; 

    void * iter = first; 
    while (true) 
    { 
    // if we're about to hit the end or 
    // if we've found where "ptr" goes 
    if (nextof(iter) == 0 || std::greater<void *>()(nextof(iter), ptr)) 
     return iter; 

    iter = nextof(iter); 
    } 
} 
+1

迷惑我的部分是,我讀了整個boost郵件列表線程,並且有幾個人(即不只是一個意見)誰使用非常強大的語言反對池圖書館。他們沒有說不使用「有序」功能,他們只是說庫不好,而Boost需要有人編寫Pool2。 – DXM

+0

我也遇到了boost :: object_pool :: free問題,速度很慢。性能問題似乎確實與find_prev()中的線性搜索有關。在我的例子中,試圖從450萬個遊戲池中釋放400K個對象需要大約半個小時。我可能需要求助於在池中保留休眠對象,直到整個池被釋放爲止。 – LRaiz

相關問題