diff options
author | Jeremy Hylton <jeremy@alum.mit.edu> | 2006-02-28 19:57:06 (GMT) |
---|---|---|
committer | Jeremy Hylton <jeremy@alum.mit.edu> | 2006-02-28 19:57:06 (GMT) |
commit | 56820c2babcfb20b4625e30671c996dac5d18494 (patch) | |
tree | b2452f3e6cd899ce5c218c684564196024f854ee /Python/pyarena.c | |
parent | dfc240450c5ed61db919023a02af4459225f3cc4 (diff) | |
download | cpython-56820c2babcfb20b4625e30671c996dac5d18494.zip cpython-56820c2babcfb20b4625e30671c996dac5d18494.tar.gz cpython-56820c2babcfb20b4625e30671c996dac5d18494.tar.bz2 |
Add some stats collection in debugging mode.
No good way to extract output yet.
Diffstat (limited to 'Python/pyarena.c')
-rw-r--r-- | Python/pyarena.c | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/Python/pyarena.c b/Python/pyarena.c index c6d0139..3a2e65c 100644 --- a/Python/pyarena.c +++ b/Python/pyarena.c @@ -1,8 +1,12 @@ #include "Python.h" #include "pyarena.h" -/* A simple arena block structure */ -/* TODO(jhylton): Measurement to justify block size. */ +/* A simple arena block structure + + Measurements with standard library modules suggest the average + allocation is about 20 bytes and that most compiles use a single + block. +*/ #define DEFAULT_BLOCK_SIZE 8192 typedef struct _block { @@ -21,6 +25,14 @@ struct _arena { block *a_head; block *a_cur; PyObject *a_objects; +#if defined(Py_DEBUG) + /* Debug output */ + size_t total_allocs; + size_t total_size; + size_t total_blocks; + size_t total_block_size; + size_t total_big_blocks; +#endif }; static block * @@ -86,12 +98,19 @@ PyArena_New() free((void *)arena); return NULL; } - arena->a_objects = PyList_New(16); + arena->a_objects = PyList_New(0); if (!arena->a_objects) { block_free(arena->a_head); free((void *)arena); return NULL; } +#if defined(Py_DEBUG) + arena->total_allocs = 0; + arena->total_size = 0; + arena->total_blocks = 1; + arena->total_block_size = DEFAULT_BLOCK_SIZE; + arena->total_big_blocks = 0; +#endif return arena; } @@ -99,6 +118,15 @@ void PyArena_Free(PyArena *arena) { assert(arena); +#if defined(Py_DEBUG) + /* + fprintf(stderr, + "alloc=%d size=%d blocks=%d block_size=%d big=%d objects=%d\n", + arena->total_allocs, arena->total_size, arena->total_blocks, + arena->total_block_size, arena->total_big_blocks, + PyList_Size(arena->a_objects)); + */ +#endif block_free(arena->a_head); assert(arena->a_objects->ob_refcnt == 1); Py_DECREF(arena->a_objects); @@ -111,9 +139,19 @@ PyArena_Malloc(PyArena *arena, size_t size) void *p = block_alloc(arena->a_cur, size); if (!p) return NULL; +#if defined(Py_DEBUG) + arena->total_allocs++; + arena->total_size += size; +#endif /* Reset cur if we allocated a new block. */ if (arena->a_cur->ab_next) { arena->a_cur = arena->a_cur->ab_next; +#if defined(Py_DEBUG) + arena->total_blocks++; + arena->total_block_size += arena->a_cur->ab_size; + if (arena->a_cur->ab_size > DEFAULT_BLOCK_SIZE) + arena->total_big_blocks++; +#endif } return p; } |