Commit 558d9da9 authored by Guido van Rossum's avatar Guido van Rossum

Faster floating point allocator, same idea as the int allocator.

By Aaron Watters.
parent a96a990b
...@@ -83,6 +83,25 @@ extern double fmod Py_PROTO((double, double)); ...@@ -83,6 +83,25 @@ extern double fmod Py_PROTO((double, double));
extern double pow Py_PROTO((double, double)); extern double pow Py_PROTO((double, double));
#endif #endif
/* Special free list -- see comments for same code in intobject.c. */
static PyFloatObject *free_list = NULL;
#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
#define N_FLOATOBJECTS (BLOCK_SIZE / sizeof(PyFloatObject))
static PyFloatObject *
fill_free_list()
{
PyFloatObject *p, *q;
p = PyMem_NEW(PyFloatObject, N_FLOATOBJECTS);
if (p == NULL)
return (PyFloatObject *)PyErr_NoMemory();
q = p + N_FLOATOBJECTS;
while (--q > p)
*(PyFloatObject **)q = q-1;
*(PyFloatObject **)q = NULL;
return p + N_FLOATOBJECTS - 1;
}
PyObject * PyObject *
#ifdef __SC__ #ifdef __SC__
PyFloat_FromDouble(double fval) PyFloat_FromDouble(double fval)
...@@ -91,11 +110,13 @@ PyFloat_FromDouble(fval) ...@@ -91,11 +110,13 @@ PyFloat_FromDouble(fval)
double fval; double fval;
#endif #endif
{ {
/* For efficiency, this code is copied from newobject() */ register PyFloatObject *op;
register PyFloatObject *op = if (free_list == NULL) {
(PyFloatObject *) malloc(sizeof(PyFloatObject)); if ((free_list = fill_free_list()) == NULL)
if (op == NULL) return NULL;
return PyErr_NoMemory(); }
op = free_list;
free_list = *(PyFloatObject **)free_list;
op->ob_type = &PyFloat_Type; op->ob_type = &PyFloat_Type;
op->ob_fval = fval; op->ob_fval = fval;
_Py_NewReference(op); _Py_NewReference(op);
...@@ -104,9 +125,10 @@ PyFloat_FromDouble(fval) ...@@ -104,9 +125,10 @@ PyFloat_FromDouble(fval)
static void static void
float_dealloc(op) float_dealloc(op)
PyObject *op; PyFloatObject *op;
{ {
PyMem_DEL(op); *(PyFloatObject **)op = free_list;
free_list = op;
} }
double double
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment