mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
GH-93354: Use exponential backoff to avoid excessive specialization attempts. (GH-93355)
This commit is contained in:
parent
a565ab0fd5
commit
eb618d5ff0
4 changed files with 93 additions and 46 deletions
|
@ -321,7 +321,7 @@ _PyCode_Quicken(PyCodeObject *code)
|
|||
}
|
||||
|
||||
static inline int
|
||||
initial_counter_value(void) {
|
||||
miss_counter_start(void) {
|
||||
/* Starting value for the counter.
|
||||
* This value needs to be not too low, otherwise
|
||||
* it would cause excessive de-optimization.
|
||||
|
@ -743,12 +743,12 @@ _Py_Specialize_LoadAttr(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name)
|
|||
fail:
|
||||
STAT_INC(LOAD_ATTR, failure);
|
||||
assert(!PyErr_Occurred());
|
||||
cache->counter = ADAPTIVE_CACHE_BACKOFF;
|
||||
cache->counter = adaptive_counter_backoff(cache->counter);
|
||||
return 0;
|
||||
success:
|
||||
STAT_INC(LOAD_ATTR, success);
|
||||
assert(!PyErr_Occurred());
|
||||
cache->counter = initial_counter_value();
|
||||
cache->counter = miss_counter_start();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -825,12 +825,12 @@ _Py_Specialize_StoreAttr(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name)
|
|||
fail:
|
||||
STAT_INC(STORE_ATTR, failure);
|
||||
assert(!PyErr_Occurred());
|
||||
cache->counter = ADAPTIVE_CACHE_BACKOFF;
|
||||
cache->counter = adaptive_counter_backoff(cache->counter);
|
||||
return 0;
|
||||
success:
|
||||
STAT_INC(STORE_ATTR, success);
|
||||
assert(!PyErr_Occurred());
|
||||
cache->counter = initial_counter_value();
|
||||
cache->counter = miss_counter_start();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1041,14 +1041,13 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name)
|
|||
success:
|
||||
STAT_INC(LOAD_METHOD, success);
|
||||
assert(!PyErr_Occurred());
|
||||
cache->counter = initial_counter_value();
|
||||
cache->counter = miss_counter_start();
|
||||
return 0;
|
||||
fail:
|
||||
STAT_INC(LOAD_METHOD, failure);
|
||||
assert(!PyErr_Occurred());
|
||||
cache->counter = ADAPTIVE_CACHE_BACKOFF;
|
||||
cache->counter = adaptive_counter_backoff(cache->counter);
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -1124,12 +1123,12 @@ _Py_Specialize_LoadGlobal(
|
|||
fail:
|
||||
STAT_INC(LOAD_GLOBAL, failure);
|
||||
assert(!PyErr_Occurred());
|
||||
cache->counter = ADAPTIVE_CACHE_BACKOFF;
|
||||
cache->counter = adaptive_counter_backoff(cache->counter);
|
||||
return 0;
|
||||
success:
|
||||
STAT_INC(LOAD_GLOBAL, success);
|
||||
assert(!PyErr_Occurred());
|
||||
cache->counter = initial_counter_value();
|
||||
cache->counter = miss_counter_start();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1253,12 +1252,12 @@ _Py_Specialize_BinarySubscr(
|
|||
fail:
|
||||
STAT_INC(BINARY_SUBSCR, failure);
|
||||
assert(!PyErr_Occurred());
|
||||
cache->counter = ADAPTIVE_CACHE_BACKOFF;
|
||||
cache->counter = adaptive_counter_backoff(cache->counter);
|
||||
return 0;
|
||||
success:
|
||||
STAT_INC(BINARY_SUBSCR, success);
|
||||
assert(!PyErr_Occurred());
|
||||
cache->counter = initial_counter_value();
|
||||
cache->counter = miss_counter_start();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1357,12 +1356,12 @@ _Py_Specialize_StoreSubscr(PyObject *container, PyObject *sub, _Py_CODEUNIT *ins
|
|||
fail:
|
||||
STAT_INC(STORE_SUBSCR, failure);
|
||||
assert(!PyErr_Occurred());
|
||||
cache->counter = ADAPTIVE_CACHE_BACKOFF;
|
||||
cache->counter = adaptive_counter_backoff(cache->counter);
|
||||
return 0;
|
||||
success:
|
||||
STAT_INC(STORE_SUBSCR, success);
|
||||
assert(!PyErr_Occurred());
|
||||
cache->counter = initial_counter_value();
|
||||
cache->counter = miss_counter_start();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1674,12 +1673,12 @@ _Py_Specialize_Call(PyObject *callable, _Py_CODEUNIT *instr, int nargs,
|
|||
if (fail) {
|
||||
STAT_INC(CALL, failure);
|
||||
assert(!PyErr_Occurred());
|
||||
cache->counter = ADAPTIVE_CACHE_BACKOFF;
|
||||
cache->counter = adaptive_counter_backoff(cache->counter);
|
||||
}
|
||||
else {
|
||||
STAT_INC(CALL, success);
|
||||
assert(!PyErr_Occurred());
|
||||
cache->counter = initial_counter_value();
|
||||
cache->counter = miss_counter_start();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -1827,11 +1826,11 @@ _Py_Specialize_BinaryOp(PyObject *lhs, PyObject *rhs, _Py_CODEUNIT *instr,
|
|||
}
|
||||
SPECIALIZATION_FAIL(BINARY_OP, binary_op_fail_kind(oparg, lhs, rhs));
|
||||
STAT_INC(BINARY_OP, failure);
|
||||
cache->counter = ADAPTIVE_CACHE_BACKOFF;
|
||||
cache->counter = adaptive_counter_backoff(cache->counter);
|
||||
return;
|
||||
success:
|
||||
STAT_INC(BINARY_OP, success);
|
||||
cache->counter = initial_counter_value();
|
||||
cache->counter = miss_counter_start();
|
||||
}
|
||||
|
||||
|
||||
|
@ -1953,11 +1952,11 @@ _Py_Specialize_CompareOp(PyObject *lhs, PyObject *rhs, _Py_CODEUNIT *instr,
|
|||
SPECIALIZATION_FAIL(COMPARE_OP, compare_op_fail_kind(lhs, rhs));
|
||||
failure:
|
||||
STAT_INC(COMPARE_OP, failure);
|
||||
cache->counter = ADAPTIVE_CACHE_BACKOFF;
|
||||
cache->counter = adaptive_counter_backoff(cache->counter);
|
||||
return;
|
||||
success:
|
||||
STAT_INC(COMPARE_OP, success);
|
||||
cache->counter = initial_counter_value();
|
||||
cache->counter = miss_counter_start();
|
||||
}
|
||||
|
||||
#ifdef Py_STATS
|
||||
|
@ -2003,11 +2002,11 @@ _Py_Specialize_UnpackSequence(PyObject *seq, _Py_CODEUNIT *instr, int oparg)
|
|||
SPECIALIZATION_FAIL(UNPACK_SEQUENCE, unpack_sequence_fail_kind(seq));
|
||||
failure:
|
||||
STAT_INC(UNPACK_SEQUENCE, failure);
|
||||
cache->counter = ADAPTIVE_CACHE_BACKOFF;
|
||||
cache->counter = adaptive_counter_backoff(cache->counter);
|
||||
return;
|
||||
success:
|
||||
STAT_INC(UNPACK_SEQUENCE, success);
|
||||
cache->counter = initial_counter_value();
|
||||
cache->counter = miss_counter_start();
|
||||
}
|
||||
|
||||
#ifdef Py_STATS
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue