Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit dd159ce

Browse files
author
Stefan Krah
committed
Speed up _decimal by 30-40% for numerical workloads by improving the cache
locality for regularly sized coefficients.
1 parent 94ef3e4 commit dd159ce

1 file changed

Lines changed: 18 additions & 16 deletions

File tree

Modules/_decimal/_decimal.c

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,13 @@
5555
#define BOUNDS_CHECK(x, MIN, MAX) x = (x < MIN || MAX < x) ? MAX : x
5656

5757

58+
/* _Py_DEC_MINALLOC >= MPD_MINALLOC */
59+
#define _Py_DEC_MINALLOC 4
60+
5861
typedef struct {
5962
PyObject_HEAD
60-
mpd_t *dec;
63+
mpd_t dec;
64+
mpd_uint_t data[_Py_DEC_MINALLOC];
6165
} PyDecObject;
6266

6367
typedef struct {
@@ -90,7 +94,7 @@ static PyTypeObject PyDecContextManager_Type;
9094
#define PyDec_Check(v) PyObject_TypeCheck(v, &PyDec_Type)
9195
#define PyDecSignalDict_Check(v) (Py_TYPE(v) == PyDecSignalDict_Type)
9296
#define PyDecContext_Check(v) PyObject_TypeCheck(v, &PyDecContext_Type)
93-
#define MPD(v) (((PyDecObject *)v)->dec)
97+
#define MPD(v) (&((PyDecObject *)v)->dec)
9498
#define SdFlagAddr(v) (((PyDecSignalDictObject *)v)->flags)
9599
#define SdFlags(v) (*((PyDecSignalDictObject *)v)->flags)
96100
#define CTX(v) (&((PyDecContextObject *)v)->ctx)
@@ -1789,35 +1793,33 @@ static PyTypeObject PyDecContextManager_Type =
17891793
static PyObject *
17901794
PyDecType_New(PyTypeObject *type)
17911795
{
1792-
PyObject *dec;
1796+
PyDecObject *dec;
17931797

17941798
if (type == &PyDec_Type) {
1795-
dec = (PyObject *)PyObject_New(PyDecObject, &PyDec_Type);
1799+
dec = PyObject_New(PyDecObject, &PyDec_Type);
17961800
}
17971801
else {
1798-
dec = type->tp_alloc(type, 0);
1802+
dec = (PyDecObject *)type->tp_alloc(type, 0);
17991803
}
18001804
if (dec == NULL) {
18011805
return NULL;
18021806
}
18031807

1804-
MPD(dec) = mpd_qnew();
1805-
if (MPD(dec) == NULL) {
1806-
Py_DECREF(dec);
1807-
PyErr_NoMemory();
1808-
return NULL;
1809-
}
1808+
MPD(dec)->flags = MPD_STATIC|MPD_STATIC_DATA;
1809+
MPD(dec)->exp = 0;
1810+
MPD(dec)->digits = 0;
1811+
MPD(dec)->len = 0;
1812+
MPD(dec)->alloc = _Py_DEC_MINALLOC;
1813+
MPD(dec)->data = dec->data;
18101814

1811-
return dec;
1815+
return (PyObject *)dec;
18121816
}
18131817
#define dec_alloc() PyDecType_New(&PyDec_Type)
18141818

18151819
static void
18161820
dec_dealloc(PyObject *dec)
18171821
{
1818-
if (MPD(dec)) {
1819-
mpd_del(MPD(dec));
1820-
}
1822+
mpd_del(MPD(dec));
18211823
Py_TYPE(dec)->tp_free(dec);
18221824
}
18231825

@@ -5342,7 +5344,7 @@ PyInit__decimal(void)
53425344
mpd_reallocfunc = PyMem_Realloc;
53435345
mpd_callocfunc = mpd_callocfunc_em;
53445346
mpd_free = PyMem_Free;
5345-
mpd_setminalloc(4);
5347+
mpd_setminalloc(_Py_DEC_MINALLOC);
53465348

53475349

53485350
/* Init types */

0 commit comments

Comments
 (0)