SF patch #884022: dynamic execution profiling vs opcode prediction

(Contributed by Andrew I MacIntyre.)

disables opcode prediction when dynamic execution
profiling is in effect, so the profiling counters at
the top of the main interpreter loop in eval_frame()
are updated for each opcode.
This commit is contained in:
Raymond Hettinger 2004-02-08 19:59:27 +00:00
parent ce9b4714ef
commit a72169871d
1 changed files with 9 additions and 0 deletions

View File

@ -645,9 +645,18 @@ eval_frame(PyFrameObject *f)
A successful prediction saves a trip through the eval-loop including A successful prediction saves a trip through the eval-loop including
its two unpredictable branches, the HASARG test and the switch-case. its two unpredictable branches, the HASARG test and the switch-case.
If collecting opcode statistics, turn off prediction so that
statistics are accurately maintained (the predictions bypass
the opcode frequency counter updates).
*/ */
#ifdef DYNAMIC_EXECUTION_PROFILE
#define PREDICT(op) if (0) goto PRED_##op
#else
#define PREDICT(op) if (*next_instr == op) goto PRED_##op #define PREDICT(op) if (*next_instr == op) goto PRED_##op
#endif
#define PREDICTED(op) PRED_##op: next_instr++ #define PREDICTED(op) PRED_##op: next_instr++
#define PREDICTED_WITH_ARG(op) PRED_##op: oparg = (next_instr[2]<<8) + \ #define PREDICTED_WITH_ARG(op) PRED_##op: oparg = (next_instr[2]<<8) + \
next_instr[1]; next_instr += 3 next_instr[1]; next_instr += 3