mirror of
https://github.com/python/cpython.git
synced 2025-10-21 22:22:48 +00:00
Huge speedup by inlining some common integer operations:
int+int, int-int, int <compareop> int, and list[int]. (Unfortunately, int*int is way too much code to inline.) Also corrected a NULL that should have been a zero.
This commit is contained in:
parent
77eecfa94d
commit
c12da6980f
1 changed files with 75 additions and 5 deletions
|
@ -762,7 +762,22 @@ eval_code2(co, globals, locals,
|
||||||
case BINARY_ADD:
|
case BINARY_ADD:
|
||||||
w = POP();
|
w = POP();
|
||||||
v = POP();
|
v = POP();
|
||||||
x = PyNumber_Add(v, w);
|
if (PyInt_Check(v) && PyInt_Check(w)) {
|
||||||
|
/* INLINE: int + int */
|
||||||
|
register long a, b, i;
|
||||||
|
a = ((PyIntObject*) v)->ob_ival;
|
||||||
|
b = ((PyIntObject*) w)->ob_ival;
|
||||||
|
i = a + b;
|
||||||
|
if ((i^a) < 0 && (i^b) < 0) {
|
||||||
|
PyErr_SetString(PyExc_OverflowError,
|
||||||
|
"integer addition");
|
||||||
|
x = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
x = PyInt_FromLong(i);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
x = PyNumber_Add(v, w);
|
||||||
Py_DECREF(v);
|
Py_DECREF(v);
|
||||||
Py_DECREF(w);
|
Py_DECREF(w);
|
||||||
PUSH(x);
|
PUSH(x);
|
||||||
|
@ -772,7 +787,22 @@ eval_code2(co, globals, locals,
|
||||||
case BINARY_SUBTRACT:
|
case BINARY_SUBTRACT:
|
||||||
w = POP();
|
w = POP();
|
||||||
v = POP();
|
v = POP();
|
||||||
x = PyNumber_Subtract(v, w);
|
if (PyInt_Check(v) && PyInt_Check(w)) {
|
||||||
|
/* INLINE: int - int */
|
||||||
|
register long a, b, i;
|
||||||
|
a = ((PyIntObject*) v)->ob_ival;
|
||||||
|
b = ((PyIntObject*) w)->ob_ival;
|
||||||
|
i = a - b;
|
||||||
|
if ((i^a) < 0 && (i^~b) < 0) {
|
||||||
|
PyErr_SetString(PyExc_OverflowError,
|
||||||
|
"integer subtraction");
|
||||||
|
x = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
x = PyInt_FromLong(i);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
x = PyNumber_Subtract(v, w);
|
||||||
Py_DECREF(v);
|
Py_DECREF(v);
|
||||||
Py_DECREF(w);
|
Py_DECREF(w);
|
||||||
PUSH(x);
|
PUSH(x);
|
||||||
|
@ -782,7 +812,24 @@ eval_code2(co, globals, locals,
|
||||||
case BINARY_SUBSCR:
|
case BINARY_SUBSCR:
|
||||||
w = POP();
|
w = POP();
|
||||||
v = POP();
|
v = POP();
|
||||||
x = PyObject_GetItem(v, w);
|
if (PyList_Check(v) && PyInt_Check(w)) {
|
||||||
|
/* INLINE: list[int] */
|
||||||
|
long i = PyInt_AsLong(w);
|
||||||
|
if (i < 0)
|
||||||
|
i += ((PyListObject*) v)->ob_size;
|
||||||
|
if (i < 0 ||
|
||||||
|
i >= ((PyListObject*) v)->ob_size) {
|
||||||
|
PyErr_SetString(PyExc_IndexError,
|
||||||
|
"list index out of range");
|
||||||
|
x = NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
x = ((PyListObject*) v)->ob_item[i];
|
||||||
|
Py_INCREF(x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
x = PyObject_GetItem(v, w);
|
||||||
Py_DECREF(v);
|
Py_DECREF(v);
|
||||||
Py_DECREF(w);
|
Py_DECREF(w);
|
||||||
PUSH(x);
|
PUSH(x);
|
||||||
|
@ -934,7 +981,7 @@ eval_code2(co, globals, locals,
|
||||||
f->f_builtins, "_", v)) == 0 &&
|
f->f_builtins, "_", v)) == 0 &&
|
||||||
!Py_SuppressPrintingFlag) {
|
!Py_SuppressPrintingFlag) {
|
||||||
err = Py_FlushLine();
|
err = Py_FlushLine();
|
||||||
if (err == NULL) {
|
if (err == 0) {
|
||||||
x = PySys_GetObject("stdout");
|
x = PySys_GetObject("stdout");
|
||||||
if (x == NULL)
|
if (x == NULL)
|
||||||
err = -1;
|
err = -1;
|
||||||
|
@ -1287,7 +1334,30 @@ eval_code2(co, globals, locals,
|
||||||
case COMPARE_OP:
|
case COMPARE_OP:
|
||||||
w = POP();
|
w = POP();
|
||||||
v = POP();
|
v = POP();
|
||||||
x = cmp_outcome(oparg, v, w);
|
if (PyInt_Check(v) && PyInt_Check(w)) {
|
||||||
|
/* INLINE: cmp(int, int) */
|
||||||
|
register long a, b;
|
||||||
|
register int res;
|
||||||
|
a = ((PyIntObject*) v)->ob_ival;
|
||||||
|
b = ((PyIntObject*) w)->ob_ival;
|
||||||
|
switch (oparg) {
|
||||||
|
case LT: res = a < b; break;
|
||||||
|
case LE: res = a <= b; break;
|
||||||
|
case EQ: res = a == b; break;
|
||||||
|
case NE: res = a != b; break;
|
||||||
|
case GT: res = a > b; break;
|
||||||
|
case GE: res = a >= b; break;
|
||||||
|
case IS: res = v == w; break;
|
||||||
|
case IS_NOT: res = v != w; break;
|
||||||
|
default: goto slow_compare;
|
||||||
|
}
|
||||||
|
x = res ? Py_True : Py_False;
|
||||||
|
Py_INCREF(x);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
slow_compare:
|
||||||
|
x = cmp_outcome(oparg, v, w);
|
||||||
|
}
|
||||||
Py_DECREF(v);
|
Py_DECREF(v);
|
||||||
Py_DECREF(w);
|
Py_DECREF(w);
|
||||||
PUSH(x);
|
PUSH(x);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue