diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2009-03-23 18:52:06 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2009-03-23 18:52:06 (GMT) |
commit | 3a652b1d0af20c7d2a9fc9251f71b2a34c49b302 (patch) | |
tree | 9972834d33037bf0daa361b04ed3eb3c9b20f75a /Include | |
parent | 17e4fddb57049ed3a29cb667b630698973d946b8 (diff) | |
download | cpython-3a652b1d0af20c7d2a9fc9251f71b2a34c49b302.zip cpython-3a652b1d0af20c7d2a9fc9251f71b2a34c49b302.tar.gz cpython-3a652b1d0af20c7d2a9fc9251f71b2a34c49b302.tar.bz2 |
Merged revisions 70546 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r70546 | antoine.pitrou | 2009-03-23 19:41:45 +0100 (lun., 23 mars 2009) | 9 lines
Issue #4688: Add a heuristic so that tuples and dicts containing only
untrackable objects are not tracked by the garbage collector. This can
reduce the size of collections and therefore the garbage collection overhead
on long-running programs, depending on their particular use of datatypes.
(trivia: this makes the "binary_trees" benchmark from the Computer Language
Shootout 40% faster)
........
Diffstat (limited to 'Include')
-rw-r--r-- | Include/dictobject.h | 1 | ||||
-rw-r--r-- | Include/objimpl.h | 11 | ||||
-rw-r--r-- | Include/tupleobject.h | 1 |
3 files changed, 13 insertions, 0 deletions
diff --git a/Include/dictobject.h b/Include/dictobject.h index 3d9d5e1..d8c409e 100644 --- a/Include/dictobject.h +++ b/Include/dictobject.h @@ -125,6 +125,7 @@ PyAPI_FUNC(PyObject *) PyDict_Copy(PyObject *mp); PyAPI_FUNC(int) PyDict_Contains(PyObject *mp, PyObject *key); PyAPI_FUNC(int) _PyDict_Contains(PyObject *mp, PyObject *key, long hash); PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused); +PyAPI_FUNC(void) _PyDict_MaybeUntrack(PyObject *mp); /* PyDict_Update(mp, other) is equivalent to PyDict_Merge(mp, other, 1). */ PyAPI_FUNC(int) PyDict_Update(PyObject *mp, PyObject *other); diff --git a/Include/objimpl.h b/Include/objimpl.h index 20d9c24..5a27382 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -282,6 +282,17 @@ extern PyGC_Head *_PyGC_generation0; g->gc.gc_next = NULL; \ } while (0); +/* True if the object is currently tracked by the GC. */ +#define _PyObject_GC_IS_TRACKED(o) \ + ((_Py_AS_GC(o))->gc.gc_refs != _PyGC_REFS_UNTRACKED) + +/* True if the object may be tracked by the GC in the future, or already is. + This can be useful to implement some optimizations. */ +#define _PyObject_GC_MAY_BE_TRACKED(obj) \ + (PyObject_IS_GC(obj) && \ + (!PyTuple_CheckExact(obj) || _PyObject_GC_IS_TRACKED(obj))) + + PyAPI_FUNC(PyObject *) _PyObject_GC_Malloc(size_t); PyAPI_FUNC(PyObject *) _PyObject_GC_New(PyTypeObject *); PyAPI_FUNC(PyVarObject *) _PyObject_GC_NewVar(PyTypeObject *, Py_ssize_t); diff --git a/Include/tupleobject.h b/Include/tupleobject.h index 7a887d1..19fe7a5 100644 --- a/Include/tupleobject.h +++ b/Include/tupleobject.h @@ -45,6 +45,7 @@ PyAPI_FUNC(int) PyTuple_SetItem(PyObject *, Py_ssize_t, PyObject *); PyAPI_FUNC(PyObject *) PyTuple_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); PyAPI_FUNC(int) _PyTuple_Resize(PyObject **, Py_ssize_t); PyAPI_FUNC(PyObject *) PyTuple_Pack(Py_ssize_t, ...); +PyAPI_FUNC(void) _PyTuple_MaybeUntrack(PyObject *); /* Macro, trading safety for speed */ #define PyTuple_GET_ITEM(op, i) (((PyTupleObject *)(op))->ob_item[i]) |