[Python-checkins] r67721 - in python/branches/release30-maint: Python/ceval.c

jeffrey.yasskin python-checkins at python.org
Fri Dec 12 18:39:28 CET 2008


Author: jeffrey.yasskin
Date: Fri Dec 12 18:39:28 2008
New Revision: 67721
Log:
Unblocked and merged revisions 67611 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/branches/py3k
................
 r67611 | jeffrey.yasskin | 2008年12月06日 09:09:27 -0800 (2008年12月06日) | 11 lines
 
 Merged revisions 67494 via svnmerge from 
 svn+ssh://pythondev@svn.python.org/python/trunk
 
 ........
 r67494 | jeffrey.yasskin | 2008年12月02日 22:46:45 -0800 (2008年12月02日) | 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.
 ........
................
Modified:
 python/branches/release30-maint/ (props changed)
 python/branches/release30-maint/Python/ceval.c
Modified: python/branches/release30-maint/Python/ceval.c
==============================================================================
--- python/branches/release30-maint/Python/ceval.c	(original)
+++ python/branches/release30-maint/Python/ceval.c	Fri Dec 12 18:39:28 2008
@@ -508,6 +508,13 @@
 static enum why_code do_raise(PyObject *, PyObject *);
 static int unpack_iterable(PyObject *, int, 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;
@@ -957,7 +964,8 @@
 
 		/* 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;
@@ -3188,6 +3196,7 @@
 {
 	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;


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /