[Patches] [ python-Patches-670367 ] Micro-optimizations for ceval.c

SourceForge.net noreply@sourceforge.net
Sat, 18 Jan 2003 21:12:06 -0800


Patches item #670367, was opened at 2003-01-18 14:07
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=305470&aid=670367&group_id=5470

Category: None
Group: Python 2.3
>Status: Closed
Resolution: Accepted
Priority: 5
Submitted By: Raymond Hettinger (rhettinger)
Assigned to: Raymond Hettinger (rhettinger)
Summary: Micro-optimizations for ceval.c

Initial Comment:
Make the code slightly shorter, faster, and easier to 
read.

* Eliminate unused DUP_TOPX code for x==1.  
compile.c always generates DUP_TOP instead.

* Since only two cases remain for DUP_TOPX, replace 
the switch-case with if-elseif.

* The in-lined integer compare does a CheckExact on 
both arguments.  Since the second is a little more 
likely to fail, test it first.

* The switch-case for IS/IS_NOT and IN/NOT_IN can 
separate the regular and inverted cases with no 
additional work.  For all four paths, saves a test and 
jump.

----------------------------------------------------------------------

>Comment By: Raymond Hettinger (rhettinger)
Date: 2003-01-19 00:12

Message:
Logged In: YES 
user_id=80475

Applied as Python/ceval.c 2.347.

----------------------------------------------------------------------

Comment By: Tim Peters (tim_one)
Date: 2003-01-18 22:50

Message:
Logged In: YES 
user_id=31435

Small non-obscure changes that reduce instruction count 
(etc) can be made even if timing shows a slowdown.  This is 
extremely dependent on platform-specific and compiler 
release-specific compiler optimization, and ceval.c is so 
complex it kicks every linear-time optimizer into 
unpredictable behavior,  It's the accumulation, over time, of 
many small changes "in the right direction" that pays off 
over time.  On the way there, timing will bounce around 
seemingly at random, and in different ways under different 
compilers and architectures.  Don't sweat it -- I don't, and 
I've done as much to speed Python as anyone <wink>.

Marked Accepted and back to Raymond.

----------------------------------------------------------------------

Comment By: Raymond Hettinger (rhettinger)
Date: 2003-01-18 20:50

Message:
Logged In: YES 
user_id=80475

Typo in the last message:

The savings for "5 in []" is 4%.

----------------------------------------------------------------------

Comment By: Raymond Hettinger (rhettinger)
Date: 2003-01-18 20:40

Message:
Logged In: YES 
user_id=80475

The attached timing code shows about a 7% speed-up for 
the IS test.  I didn't expect this much but then IS is a low 
overhead test.

The same test for IS NOT shows 5%.

The same test for "5 in []" shows only 1%.

----------------------------------------------------------------------

Comment By: Raymond Hettinger (rhettinger)
Date: 2003-01-18 20:07

Message:
Logged In: YES 
user_id=80475

These micro-optimizations are so small that they don't 
warrant setting-up timing code to show a 1% change.  
Neal's micro-optimizations were not individually tested and 
timed.  Likewise, Tim commented that these are all steps 
in the right direction even if they can't be individually 
timed. OTOH, if any of these look like a step backwards, 
they ought to be zapped. All that being said, I would still 
make a timing suite if weren't so difficult to get consistent 
timings on WindowsME.

The benefit for the switch-case is observable in the 
assembly output which shows one-fewer test jump on 
every path and no other changes.

The elimination of an unused case for dup_topx is a 
continuation of what GvR okayed on python-dev.  There is 
a slight savings in code volume.  There will be no time 
saved because the code was never called.

The conversion from switch-case to if-else follows the 
recommendations from Intel's Software Optimization 
Cookbook.  It says that the if-else form has a chance at 
branch prediction, while the calculated jump does not.  
More importantly, the code is just a little bit clearer than 
the 2 case switch.

Changing the order of the PyInt_CheckExact tests came 
from the observation that "anInt in aContainer" would pass 
the first test but not the second.

----------------------------------------------------------------------

Comment By: Martin v. Löwis (loewis)
Date: 2003-01-18 17:52

Message:
Logged In: YES 
user_id=21627

What kind of speed-up have you observed for what test case?

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=305470&aid=670367&group_id=5470