Patches for (two forms of) optional dynamic execution profiling --
i.e., counting opcode frequencies, or (with DXPAIRS defined) opcode pair frequencies. Define DYNAMIC_EXECUTION_PROFILE on the command line (for this file and for sysmodule.c) to enable.
This commit is contained in:
parent
8c5df06ec7
commit
950361c6ca
|
@ -103,6 +103,17 @@ static int exec_statement PROTO((object *, object *, object *));
|
||||||
static object *find_from_args PROTO((frameobject *, int));
|
static object *find_from_args PROTO((frameobject *, int));
|
||||||
|
|
||||||
|
|
||||||
|
/* Dynamic execution profile */
|
||||||
|
#ifdef DYNAMIC_EXECUTION_PROFILE
|
||||||
|
#ifdef DXPAIRS
|
||||||
|
static long dxpairs[257][256];
|
||||||
|
#define dxp dxpairs[256]
|
||||||
|
#else
|
||||||
|
static long dxp[256];
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Pointer to current frame, used to link new frames to */
|
/* Pointer to current frame, used to link new frames to */
|
||||||
|
|
||||||
static frameobject *current_frame;
|
static frameobject *current_frame;
|
||||||
|
@ -315,6 +326,9 @@ eval_code2(co, globals, locals,
|
||||||
int defcount;
|
int defcount;
|
||||||
object *owner;
|
object *owner;
|
||||||
{
|
{
|
||||||
|
#ifdef DXPAIRS
|
||||||
|
int lastopcode = 0;
|
||||||
|
#endif
|
||||||
register unsigned char *next_instr;
|
register unsigned char *next_instr;
|
||||||
register int opcode = 0; /* Current opcode */
|
register int opcode = 0; /* Current opcode */
|
||||||
register int oparg = 0; /* Current opcode argument, if any */
|
register int oparg = 0; /* Current opcode argument, if any */
|
||||||
|
@ -592,6 +606,13 @@ eval_code2(co, globals, locals,
|
||||||
opcode = NEXTOP();
|
opcode = NEXTOP();
|
||||||
if (HAS_ARG(opcode))
|
if (HAS_ARG(opcode))
|
||||||
oparg = NEXTARG();
|
oparg = NEXTARG();
|
||||||
|
#ifdef DYNAMIC_EXECUTION_PROFILE
|
||||||
|
#ifdef DXPAIRS
|
||||||
|
dxpairs[lastopcode][opcode]++;
|
||||||
|
lastopcode = opcode;
|
||||||
|
#endif
|
||||||
|
dxp[opcode]++;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef LLTRACE
|
#ifdef LLTRACE
|
||||||
/* Instruction tracing */
|
/* Instruction tracing */
|
||||||
|
@ -2961,3 +2982,50 @@ find_from_args(f, nexti)
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DYNAMIC_EXECUTION_PROFILE
|
||||||
|
|
||||||
|
PyObject *
|
||||||
|
getarray(a)
|
||||||
|
long a[256];
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
PyObject *l = PyList_New(256);
|
||||||
|
if (l == NULL) return NULL;
|
||||||
|
for (i = 0; i < 256; i++) {
|
||||||
|
PyObject *x = PyInt_FromLong(a[i]);
|
||||||
|
if (x == NULL) {
|
||||||
|
Py_DECREF(l);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
PyList_SetItem(l, i, x);
|
||||||
|
}
|
||||||
|
for (i = 0; i < 256; i++)
|
||||||
|
a[i] = 0;
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
PyObject *
|
||||||
|
_Py_GetDXProfile(self, args)
|
||||||
|
PyObject *self, *args;
|
||||||
|
{
|
||||||
|
#ifndef DXPAIRS
|
||||||
|
return getarray(dxp);
|
||||||
|
#else
|
||||||
|
int i;
|
||||||
|
PyObject *l = PyList_New(257);
|
||||||
|
if (l == NULL) return NULL;
|
||||||
|
for (i = 0; i < 257; i++) {
|
||||||
|
PyObject *x = getarray(dxpairs[i]);
|
||||||
|
if (x == NULL) {
|
||||||
|
Py_DECREF(l);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
PyList_SetItem(l, i, x);
|
||||||
|
}
|
||||||
|
return l;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue