Witam,
W swoim kodzie zaimplementowałem memory poola z biblioteki boost:<boost/pool/object_pool.hpp>
aby móc szybko zaalokować pamięć dla dużej ilości obiektów pewnej struktury o niewielkim rozmiarze oraz szybko ją potem zwolnić. Są to proste obiekty i wystarcza im zwolnienie bloku pamięci więc nie trzeba martwić sie o wywoływanie dla nich destruktorów itp.
Rozwiązanie to działa. Problem pojawia się gdy obiektów jest dużo i chcę zwalniać pamięć szybko pojedyńczych obiektów. Okazuje się że metody destroy(wywołuje konstruktor) oraz free (nie wywołuje konstruktora) przy sporym rozmiarze memory poola działają znacznie wolniej niż zwykły operator delete. Wydaje mi się że jest to spowodowane przez funkcję:
void * simple_segregated_storage<SizeType>::find_prev(void * const ptr)
W której jest wyszukiwanie czy dany adres znajduje się we "free list"
W dokumentacji http://www.boost.org/doc/libs/1_61_0/libs/pool/doc/html/boost_pool/pool/interfaces.html znalazłem taką informację:
Ordered versus unordered
An ordered pool maintains it's free list in order of the address of each free block - this is the most efficient way if you're likely to allocate arrays of objects. However, freeing an object can be O(N) in the number of currently free blocks which can be prohibitively expensive in some situations.An unordered pool does not maintain it's free list in any particular order, as a result allocation and freeing single objects is very fast, but allocating arrays may be slow (and in particular the pool may not be aware that it contains enough free memory for the allocation request, and unnecessarily allocate more memory).
Czy wobec tego rozwiązaniem mojego problemu może być unordered pool i jeśli tak to czy jakaś implementacja memory poola z biblioteki boost opiera się na tej zasadzie działania i czy mogę z niej skorzystać?
Z góry dziękuje za pomoc.