mirror of
https://github.com/python/cpython.git
synced 2025-08-27 20:25:18 +00:00
GH-109329: Add tier 2 stats (GH-109913)
This commit is contained in:
parent
f7860295b1
commit
e561e98058
9 changed files with 483 additions and 128 deletions
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include "opcode.h"
|
||||
|
||||
#include "pycore_bitutils.h"
|
||||
#include "pycore_call.h"
|
||||
#include "pycore_ceval.h"
|
||||
#include "pycore_dict.h"
|
||||
|
@ -30,6 +31,16 @@
|
|||
goto deoptimize; \
|
||||
}
|
||||
|
||||
#ifdef Py_STATS
|
||||
// Disable these macros that apply to Tier 1 stats when we are in Tier 2
|
||||
#undef STAT_INC
|
||||
#define STAT_INC(opname, name) ((void)0)
|
||||
#undef STAT_DEC
|
||||
#define STAT_DEC(opname, name) ((void)0)
|
||||
#undef CALL_STAT_INC
|
||||
#define CALL_STAT_INC(name) ((void)0)
|
||||
#endif
|
||||
|
||||
#undef ENABLE_SPECIALIZATION
|
||||
#define ENABLE_SPECIALIZATION 0
|
||||
|
||||
|
@ -62,12 +73,15 @@ _PyUopExecute(_PyExecutorObject *executor, _PyInterpreterFrame *frame, PyObject
|
|||
|
||||
CHECK_EVAL_BREAKER();
|
||||
|
||||
OBJECT_STAT_INC(optimization_traces_executed);
|
||||
OPT_STAT_INC(traces_executed);
|
||||
_Py_CODEUNIT *ip_offset = (_Py_CODEUNIT *)_PyFrame_GetCode(frame)->co_code_adaptive;
|
||||
int pc = 0;
|
||||
int opcode;
|
||||
int oparg;
|
||||
uint64_t operand;
|
||||
#ifdef Py_STATS
|
||||
uint64_t trace_uop_execution_counter = 0;
|
||||
#endif
|
||||
|
||||
for (;;) {
|
||||
opcode = self->trace[pc].opcode;
|
||||
|
@ -81,7 +95,12 @@ _PyUopExecute(_PyExecutorObject *executor, _PyInterpreterFrame *frame, PyObject
|
|||
operand,
|
||||
(int)(stack_pointer - _PyFrame_Stackbase(frame)));
|
||||
pc++;
|
||||
OBJECT_STAT_INC(optimization_uops_executed);
|
||||
OPT_STAT_INC(uops_executed);
|
||||
UOP_EXE_INC(opcode);
|
||||
#ifdef Py_STATS
|
||||
trace_uop_execution_counter++;
|
||||
#endif
|
||||
|
||||
switch (opcode) {
|
||||
|
||||
#include "executor_cases.c.h"
|
||||
|
@ -114,6 +133,7 @@ error:
|
|||
// On ERROR_IF we return NULL as the frame.
|
||||
// The caller recovers the frame from tstate->current_frame.
|
||||
DPRINTF(2, "Error: [Opcode %d, operand %" PRIu64 "]\n", opcode, operand);
|
||||
OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
Py_DECREF(self);
|
||||
return NULL;
|
||||
|
@ -122,6 +142,7 @@ deoptimize:
|
|||
// On DEOPT_IF we just repeat the last instruction.
|
||||
// This presumes nothing was popped from the stack (nor pushed).
|
||||
DPRINTF(2, "DEOPT: [Opcode %d, operand %" PRIu64 "]\n", opcode, operand);
|
||||
OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
|
||||
frame->prev_instr--; // Back up to just before destination
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
Py_DECREF(self);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue