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:
Christian Thaeter 2009-05-14 22:43:05 +02:00
parent 29a1a6a7a0
commit 9ed817df97
2 changed files with 13 additions and 17 deletions

View file

@ -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);
}

View file

@ -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;