mpool: precalculate cluster size to avoid excess recalculations
Callgrind before: 1,963,501,246 PROGRAM TOTALS After: 1,747,160,336 PROGRAM TOTALS
This commit is contained in:
parent
29a1a6a7a0
commit
9ed817df97
2 changed files with 13 additions and 17 deletions
|
|
@ -21,7 +21,6 @@
|
|||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <limits.h>
|
||||
|
||||
|
|
@ -51,6 +50,9 @@ struct mpoolnode_struct
|
|||
llist node;
|
||||
};
|
||||
|
||||
#define MPOOL_BITMAP_SIZE(elements_per_cluster) \
|
||||
(((elements_per_cluster) + sizeof(uintptr_t)*CHAR_BIT - 1) \
|
||||
/ (sizeof(uintptr_t) * CHAR_BIT) * sizeof (uintptr_t))
|
||||
|
||||
MPool
|
||||
mpool_init (MPool self, size_t elem_size, unsigned elements_per_cluster, mpool_destroy_fn dtor)
|
||||
|
|
@ -69,6 +71,10 @@ mpool_init (MPool self, size_t elem_size, unsigned elements_per_cluster, mpool_d
|
|||
|
||||
self->elements_per_cluster = elements_per_cluster;
|
||||
|
||||
self->cluster_size = sizeof (mpoolcluster) + /* header */
|
||||
MPOOL_BITMAP_SIZE (self->elements_per_cluster) + /* bitmap */
|
||||
self->elem_size * self->elements_per_cluster; /* elements */
|
||||
|
||||
self->elements_free = 0;
|
||||
self->destroy = dtor;
|
||||
self->locality = NULL;
|
||||
|
|
@ -78,11 +84,6 @@ mpool_init (MPool self, size_t elem_size, unsigned elements_per_cluster, mpool_d
|
|||
}
|
||||
|
||||
|
||||
#define MPOOL_BITMAP_SIZE(elements_per_cluster) \
|
||||
(((elements_per_cluster) + sizeof(uintptr_t)*CHAR_BIT - 1) \
|
||||
/ (sizeof(uintptr_t) * CHAR_BIT) * sizeof (uintptr_t))
|
||||
|
||||
|
||||
static inline void*
|
||||
cluster_element_get (MPoolcluster cluster, MPool self, unsigned n)
|
||||
{
|
||||
|
|
@ -142,10 +143,7 @@ mpool_destroy (MPool self)
|
|||
MPool
|
||||
mpool_cluster_alloc_ (MPool self)
|
||||
{
|
||||
MPoolcluster cluster = malloc (sizeof (*cluster) + /* header */
|
||||
MPOOL_BITMAP_SIZE (self->elements_per_cluster) + /* bitmap */
|
||||
self->elem_size * self->elements_per_cluster); /* elements */
|
||||
|
||||
MPoolcluster cluster = malloc (self->cluster_size);
|
||||
TRACE (mpool_dbg, "%p", cluster);
|
||||
|
||||
if (!cluster)
|
||||
|
|
@ -171,16 +169,12 @@ mpool_cluster_alloc_ (MPool self)
|
|||
|
||||
|
||||
static int
|
||||
cmp_cluster_contains_element (const_LList cluster, const_LList element, void* self)
|
||||
cmp_cluster_contains_element (const_LList cluster, const_LList element, void* cluster_size)
|
||||
{
|
||||
if (element < cluster)
|
||||
return -1;
|
||||
|
||||
if ((void*)element >
|
||||
(void*)cluster +
|
||||
sizeof (*cluster) + /* header */
|
||||
MPOOL_BITMAP_SIZE (((MPool)self)->elements_per_cluster) + /* bitmap */
|
||||
((MPool)self)->elem_size * ((MPool)self)->elements_per_cluster) /* elements */
|
||||
if ((void*)element > (void*)cluster + (uintptr_t)cluster_size)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
|
|
@ -190,7 +184,7 @@ cmp_cluster_contains_element (const_LList cluster, const_LList element, void* se
|
|||
static inline MPoolcluster
|
||||
element_cluster_get (MPool self, void* element)
|
||||
{
|
||||
return (MPoolcluster) llist_ufind (&self->clusters, (const_LList) element, cmp_cluster_contains_element, self);
|
||||
return (MPoolcluster) llist_ufind (&self->clusters, (const_LList) element, cmp_cluster_contains_element, (void*)self->cluster_size);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <nobug.h>
|
||||
#include "lib/llist.h"
|
||||
#include "include/logging.h"
|
||||
|
|
@ -79,6 +80,7 @@ struct mpool_struct
|
|||
llist clusters;
|
||||
size_t elem_size;
|
||||
unsigned elements_per_cluster;
|
||||
uintptr_t cluster_size;
|
||||
unsigned elements_free; /* a counter of free elements is the price we pay to support a reserve() operation */
|
||||
void* locality;
|
||||
mpool_destroy_fn destroy;
|
||||
|
|
|
|||
Loading…
Reference in a new issue