[Python-checkins] r60646 - python/trunk/Objects/dictobject.c python/trunk/Objects/listobject.c
Neal Norwitz
nnorwitz at gmail.com
Sun Feb 24 03:46:55 CET 2008
The format strings should use PY_FORMAT_SIZE_T instead of "z". See
Include/pyport.h for the details.
I'm not sure how many other places we are using %zd etc, but those
should be fixed.
n
--
On Thu, Feb 7, 2008 at 9:15 AM, christian.heimes
<python-checkins at python.org> wrote:
> Author: christian.heimes
> Date: Thu Feb 7 18:15:30 2008
> New Revision: 60646
>
> Modified:
> python/trunk/Objects/dictobject.c
> python/trunk/Objects/listobject.c
> Log:
> Added some statistics code to dict and list object code. I wanted to test how a larger freelist affects the reusage of freed objects. Contrary to my gut feelings 80 objects is more than fine for small apps. I haven't profiled a large app yet.
>
> Modified: python/trunk/Objects/dictobject.c
> ==============================================================================
> --- python/trunk/Objects/dictobject.c (original)
> +++ python/trunk/Objects/dictobject.c Thu Feb 7 18:15:30 2008
> @@ -162,6 +162,22 @@
> }
> #endif
>
> +/* Debug statistic to compare allocations with reuse through the free list */
> +#undef SHOW_ALLOC_COUNT
> +#ifdef SHOW_ALLOC_COUNT
> +static size_t count_alloc = 0;
> +static size_t count_reuse = 0;
> +
> +static void
> +show_alloc(void)
> +{
> + fprintf(stderr, "Dict allocations: %zd\n", count_alloc);
> + fprintf(stderr, "Dict reuse through freelist: %zd\n", count_reuse);
> + fprintf(stderr, "%.2f%% reuse rate\n\n",
> + (100.0*count_reuse/(count_alloc+count_reuse)));
> +}
> +#endif
> +
> /* Initialization macros.
> There are two ways to create a dict: PyDict_New() is the main C API
> function, and the tp_new slot maps to dict_new(). In the latter case we
> @@ -200,6 +216,9 @@
> #ifdef SHOW_CONVERSION_COUNTS
> Py_AtExit(show_counts);
> #endif
> +#ifdef SHOW_ALLOC_COUNT
> + Py_AtExit(show_alloc);
> +#endif
> }
> if (numfree) {
> mp = free_list[--numfree];
> @@ -212,11 +231,17 @@
> assert (mp->ma_used == 0);
> assert (mp->ma_table == mp->ma_smalltable);
> assert (mp->ma_mask == PyDict_MINSIZE - 1);
> +#ifdef SHOW_ALLOC_COUNT
> + count_reuse++;
> +#endif
> } else {
> mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
> if (mp == NULL)
> return NULL;
> EMPTY_TO_MINSIZE(mp);
> +#ifdef SHOW_ALLOC_COUNT
> + count_alloc++;
> +#endif
> }
> mp->ma_lookup = lookdict_string;
> #ifdef SHOW_CONVERSION_COUNTS
>
> Modified: python/trunk/Objects/listobject.c
> ==============================================================================
> --- python/trunk/Objects/listobject.c (original)
> +++ python/trunk/Objects/listobject.c Thu Feb 7 18:15:30 2008
> @@ -63,6 +63,22 @@
> return 0;
> }
>
> +/* Debug statistic to compare allocations with reuse through the free list */
> +#undef SHOW_ALLOC_COUNT
> +#ifdef SHOW_ALLOC_COUNT
> +static size_t count_alloc = 0;
> +static size_t count_reuse = 0;
> +
> +static void
> +show_alloc(void)
> +{
> + fprintf(stderr, "List allocations: %zd\n", count_alloc);
> + fprintf(stderr, "List reuse through freelist: %zd\n", count_reuse);
> + fprintf(stderr, "%.2f%% reuse rate\n\n",
> + (100.0*count_reuse/(count_alloc+count_reuse)));
> +}
> +#endif
> +
> /* Empty list reuse scheme to save calls to malloc and free */
> #ifndef PyList_MAXFREELIST
> #define PyList_MAXFREELIST 80
> @@ -88,6 +104,13 @@
> {
> PyListObject *op;
> size_t nbytes;
> +#ifdef SHOW_ALLOC_COUNT
> + static int initialized = 0;
> + if (!initialized) {
> + Py_AtExit(show_alloc);
> + initialized = 1;
> + }
> +#endif
>
> if (size < 0) {
> PyErr_BadInternalCall();
> @@ -101,10 +124,16 @@
> numfree--;
> op = free_list[numfree];
> _Py_NewReference((PyObject *)op);
> +#ifdef SHOW_ALLOC_COUNT
> + count_reuse++;
> +#endif
> } else {
> op = PyObject_GC_New(PyListObject, &PyList_Type);
> if (op == NULL)
> return NULL;
> +#ifdef SHOW_ALLOC_COUNT
> + count_alloc++;
> +#endif
> }
> if (size <= 0)
> op->ob_item = NULL;
> _______________________________________________
> Python-checkins mailing list
> Python-checkins at python.org
> http://mail.python.org/mailman/listinfo/python-checkins
>
More information about the Python-checkins
mailing list