diff options
| author | Jeffrey Yasskin <jyasskin@gmail.com> | 2008-12-12 21:25:13 (GMT) | 
|---|---|---|
| committer | Jeffrey Yasskin <jyasskin@gmail.com> | 2008-12-12 21:25:13 (GMT) | 
| commit | d0a70d4bab2ba95ce1d6eae73f61f1e4cdf35941 (patch) | |
| tree | 8039fbb31f2bb8ed28d5fc2552fb690c1dd24c24 | |
| parent | 696d6ba6b9c03884c80c789ffb6486f8a65795ab (diff) | |
| download | cpython-d0a70d4bab2ba95ce1d6eae73f61f1e4cdf35941.zip cpython-d0a70d4bab2ba95ce1d6eae73f61f1e4cdf35941.tar.gz cpython-d0a70d4bab2ba95ce1d6eae73f61f1e4cdf35941.tar.bz2  | |
Unblocked and merged revisions 67494 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r67494 | jeffrey.yasskin | 2008-12-02 22:46:45 -0800 (Tue, 02 Dec 2008) | 5 lines
  Speed up Python (according to pybench and 2to3-on-itself) by 1-2% by caching
  whether any thread has tracing turned on, which saves one load instruction in
  the fast_next_opcode path in PyEval_EvalFrameEx().  See issue 4477.
........
| -rw-r--r-- | Python/ceval.c | 11 | 
1 files changed, 10 insertions, 1 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index 5bac65f..bd35185 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -504,6 +504,13 @@ enum why_code {  static enum why_code do_raise(PyObject *, PyObject *, PyObject *);  static int unpack_iterable(PyObject *, int, PyObject **); +/* Records whether tracing is on for any thread.  Counts the number of +   threads for which tstate->c_tracefunc is non-NULL, so if the value +   is 0, we know we don't have to check this thread's c_tracefunc. +   This speeds up the if statement in PyEval_EvalFrameEx() after +   fast_next_opcode*/ +static int _Py_TracingPossible = 0; +  /* for manipulating the thread switch and periodic "stuff" - used to be     per thread, now just a pair o' globals */  int _Py_CheckInterval = 100; @@ -886,7 +893,8 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)  		/* line-by-line tracing support */ -		if (tstate->c_tracefunc != NULL && !tstate->tracing) { +		if (_Py_TracingPossible && +		    tstate->c_tracefunc != NULL && !tstate->tracing) {  			/* see maybe_call_line_trace  			   for expository comments */  			f->f_stacktop = stack_pointer; @@ -3432,6 +3440,7 @@ PyEval_SetTrace(Py_tracefunc func, PyObject *arg)  {  	PyThreadState *tstate = PyThreadState_GET();  	PyObject *temp = tstate->c_traceobj; +	_Py_TracingPossible += (func != NULL) - (tstate->c_tracefunc != NULL);  	Py_XINCREF(arg);  	tstate->c_tracefunc = NULL;  	tstate->c_traceobj = NULL;  | 
