[Patches] [ python-Patches-918462 ] simple

SourceForge.net noreply at sourceforge.net
Mon Mar 22 20:57:26 EST 2004


Patches item #918462, was opened at 2004-03-17 20:50
Message generated for change (Settings changed) made by rhettinger
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=305470&aid=918462&group_id=5470

Category: Core (C code)
Group: Python 2.4
>Status: Open
>Resolution: None
Priority: 5
Submitted By: Skip Montanaro (montanaro)
Assigned to: Raymond Hettinger (rhettinger)
Summary: simple 

Initial Comment:
All this "is" vs "==" discussion led me to look at ceval.c.  
The attached patch seems to speed up "is" and "is not" 
comparisons - saving a function call to do a simple pointer 
comparison for non-integer arguments.

The test suite passes, but it's been quite awhile since I 
messed around with the interpreter code, so I thought I 
ought to have another pair of eyeballs check it out...


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

Comment By: Skip Montanaro (montanaro)
Date: 2004-03-22 16:53

Message:
Logged In: YES 
user_id=44345

I reran the test on a Linux system today and got similar results.  
I'm pasting them here mostly as documentation.  I'm still a bit 
confused why the == and > tests should show improvement, but 
they often do on both platforms.  Any ideas? Looking at the 
assembly code generated GCC inserts basically the same four 
instructions on both the Intel and PowerPC platforms:

	cmpl	$8, -40(%ebp)
	je	.L580
	cmpl	$9, -40(%ebp)
	je	.L583

on Intel or

	cmpwi cr7,r24,8
	beq- cr7,L622
	cmpwi cr7,r24,9
	beq- cr7,L625

on PowerPC.

I also tried pystone.  I see performance hits on both Linux and 
Mac OSX:

    Fastest of ten runs

		    patched                 unpatched
    Linux           37878.8                 38167.9
    Mac OSX         13888.9                 14124.3

Oh well...  It was a thought.

Test output on Linux:


s = 'abc'
operation          before        after        delta         %chg
---------          ------        -----        -----         ----
s is 'abc'          0.116        0.103        0.013        -11.2
s == 'abc'          0.145        0.141        0.004         -2.8
s > 'abc'           0.140        0.142       -0.002          1.4
s is 4              0.139        0.121        0.018        -12.9
s == 4              0.271        0.293       -0.022          8.1
s > 4               0.276        0.273        0.003         -1.1
s is -1001          0.126        0.120        0.006         -4.8
s == -1001          0.270        0.272       -0.002          0.7
s > -1001           0.282        0.275        0.007         -2.5
s is 34.7           0.133        0.119        0.014        -10.5
s == 34.7           0.352        0.343        0.009         -2.6
s > 34.7            0.340        0.344       -0.004          1.2
s is 'a b c'        0.135        0.118        0.017        -12.6
s == 'a b c'        0.159        0.157        0.002         -1.3
s > 'a b c'         0.200        0.201       -0.001          0.5
s is True           0.177        0.170        0.007         -4.0
s == True           0.316        0.318       -0.002          0.6
s > True            0.321        0.321        0.000          0.0

s = 4
operation          before        after        delta         %chg
---------          ------        -----        -----         ----
s is 'abc'          0.143        0.120        0.023        -16.1
s == 'abc'          0.266        0.285       -0.019          7.1
s > 'abc'           0.270        0.276       -0.006          2.2
s is 4              0.175        0.103        0.072        -41.1
s == 4              0.105        0.105        0.000          0.0
s > 4               0.106        0.107       -0.001          0.9
s is -1001          0.119        0.119        0.000          0.0
s == -1001          0.119        0.119        0.000          0.0
s > -1001           0.121        0.178       -0.057         47.1
s is 34.7           0.127        0.129       -0.002          1.6
s == 34.7           0.201        0.195        0.006         -3.0
s > 34.7            0.193        0.197       -0.004          2.1
s is 'a b c'        0.212        0.125        0.087        -41.0
s == 'a b c'        0.268        0.271       -0.003          1.1
s > 'a b c'         0.269        0.276       -0.007          2.6
s is True           0.196        0.160        0.036        -18.4
s == True           0.239        0.258       -0.019          7.9
s > True            0.265        0.237        0.028        -10.6

s = None
operation          before        after        delta         %chg
---------          ------        -----        -----         ----
s is 'abc'          0.120        0.109        0.011         -9.2
s == 'abc'          0.203        0.204       -0.001          0.5
s > 'abc'           0.206        0.206        0.000          0.0
s is 4              0.119        0.110        0.009         -7.6
s == 4              0.217        0.214        0.003         -1.4
s > 4               0.214        0.220       -0.006          2.8
s is -1001          0.120        0.107        0.013        -10.8
s == -1001          0.207        0.207        0.000          0.0
s > -1001           0.207        0.214       -0.007          3.4
s is 34.7           0.122        0.112        0.010         -8.2
s == 34.7           0.274        0.270        0.004         -1.5
s > 34.7            0.272        0.271        0.001         -0.4
s is 'a b c'        0.148        0.128        0.020        -13.5
s == 'a b c'        0.240        0.242       -0.002          0.8
s > 'a b c'         0.206        0.210       -0.004          1.9
s is True           0.162        0.153        0.009         -5.6
s == True           0.267        0.262        0.005         -1.9
s > True            0.284        0.258        0.026         -9.2

s = -1000
operation          before        after        delta         %chg
---------          ------        -----        -----         ----
s is 'abc'          0.218        0.128        0.090        -41.3
s == 'abc'          0.274        0.275       -0.001          0.4
s > 'abc'           0.264        0.301       -0.037         14.0
s is 4              0.125        0.120        0.005         -4.0
s == 4              0.123        0.122        0.001         -0.8
s > 4               0.119        0.121       -0.002          1.7
s is -1001          0.123        0.123        0.000          0.0
s == -1001          0.132        0.123        0.009         -6.8
s > -1001           0.121        0.121        0.000          0.0
s is 34.7           0.130        0.215       -0.085         65.4
s == 34.7           0.199        0.197        0.002         -1.0
s > 34.7            0.194        0.236       -0.042         21.6
s is 'a b c'        0.158        0.140        0.018        -11.4
s == 'a b c'        0.294        0.293        0.001         -0.3
s > 'a b c'         0.302        0.300        0.002         -0.7
s is True           0.190        0.161        0.029        -15.3
s == True           0.234        0.232        0.002         -0.9
s > True            0.238        0.234        0.004         -1.7

s = 34.2
operation          before        after        delta         %chg
---------          ------        -----        -----         ----
s is 'abc'          0.133        0.120        0.013         -9.8
s == 'abc'          0.338        0.330        0.008         -2.4
s > 'abc'           0.350        0.338        0.012         -3.4
s is 4              0.126        0.121        0.005         -4.0
s == 4              0.194        0.197       -0.003          1.5
s > 4               0.193        0.196       -0.003          1.6
s is -1001          0.132        0.120        0.012         -9.1
s == -1001          0.293        0.193        0.100        -34.1
s > -1001           0.196        0.190        0.006         -3.1
s is 34.7           0.117        0.105        0.012        -10.3
s == 34.7           0.153        0.153        0.000          0.0
s > 34.7            0.156        0.155        0.001         -0.6
s is 'a b c'        0.152        0.138        0.014         -9.2
s == 'a b c'        0.360        0.398       -0.038         10.6
s > 'a b c'         0.334        0.354       -0.020          6.0
s is True           0.171        0.174       -0.003          1.8
s == True           0.248        0.254       -0.006          2.4
s > True            0.247        0.244        0.003         -1.2

s = 'a b c'
operation          before        after        delta         %chg
---------          ------        -----        -----         ----
s is 'abc'          0.137        0.117        0.020        -14.6
s == 'abc'          0.157        0.158       -0.001          0.6
s > 'abc'           0.204        0.201        0.003         -1.5
s is 4              0.131        0.119        0.012         -9.2
s == 4              0.269        0.272       -0.003          1.1
s > 4               0.277        0.277        0.000          0.0
s is -1001          0.153        0.146        0.007         -4.6
s == -1001          0.299        0.294        0.005         -1.7
s > -1001           0.299        0.302       -0.003          1.0
s is 34.7           0.153        0.146        0.007         -4.6
s == 34.7           0.374        0.368        0.006         -1.6
s > 34.7            0.342        0.336        0.006         -1.8
s is 'a b c'        0.140        0.118        0.022        -15.7
s == 'a b c'        0.150        0.158       -0.008          5.3
s > 'a b c'         0.160        0.156        0.004         -2.5
s is True           0.193        0.194       -0.001          0.5
s == True           0.345        0.338        0.007         -2.0
s > True            0.318        0.319       -0.001          0.3

s = object()
operation          before        after        delta         %chg
---------          ------        -----        -----         ----
s is 'abc'          0.158        0.143        0.015         -9.5
s == 'abc'          0.298        0.294        0.004         -1.3
s > 'abc'           0.288        0.292       -0.004          1.4
s is 4              0.129        0.121        0.008         -6.2
s == 4              0.249        0.250       -0.001          0.4
s > 4               0.248        0.249       -0.001          0.4
s is -1001          0.151        0.152       -0.001          0.7
s == -1001          0.271        0.266        0.005         -1.8
s > -1001           0.284        0.271        0.013         -4.6
s is 34.7           0.152        0.140        0.012         -7.9
s == 34.7           0.364        0.385       -0.021          5.8
s > 34.7            0.429        0.392        0.037         -8.6
s is 'a b c'        0.152        0.138        0.014         -9.2
s == 'a b c'        0.300        0.297        0.003         -1.0
s > 'a b c'         0.288        0.285        0.003         -1.0
s is True           0.192        0.184        0.008         -4.2
s == True           0.325        0.329       -0.004          1.2
s > True            0.324        0.322        0.002         -0.6

s = []
operation          before        after        delta         %chg
---------          ------        -----        -----         ----
s is 'abc'          0.126        0.121        0.005         -4.0
s == 'abc'          0.266        0.285       -0.019          7.1
s > 'abc'           0.273        0.271        0.002         -0.7
s is 4              0.125        0.119        0.006         -4.8
s == 4              0.269        0.269        0.000          0.0
s > 4               0.268        0.274       -0.006          2.2
s is -1001          0.133        0.121        0.012         -9.0
s == -1001          0.269        0.291       -0.022          8.2
s > -1001           0.271        0.269        0.002         -0.7
s is 34.7           0.132        0.124        0.008         -6.1
s == 34.7           0.332        0.362       -0.030          9.0
s > 34.7            0.339        0.336        0.003         -0.9
s is 'a b c'        0.125        0.119        0.006         -4.8
s == 'a b c'        0.268        0.291       -0.023          8.6
s > 'a b c'         0.275        0.273        0.002         -0.7
s is True           0.171        0.164        0.007         -4.1
s == True           0.317        0.315        0.002         -0.6
s > True            0.338        0.316        0.022         -6.5




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

Comment By: Skip Montanaro (montanaro)
Date: 2004-03-21 09:33

Message:
Logged In: YES 
user_id=44345

I spent a fair amount of time yesterday refining and running a 
shell script (attached) to compare the before and after times for 
various comparisons of simple objects.  Here's the output:


s = 'abc'
operation          before        after        delta         %chg
---------          ------        -----        -----         ----
s is 'abc'          0.375        0.329        0.046        -12.3
s == 'abc'          0.491        0.493       -0.002          0.4
s > 'abc'           0.491        0.493       -0.002          0.4
s is 4              0.375        0.333        0.042        -11.2
s == 4              1.200        1.190        0.010         -0.8
s > 4               1.200        1.190        0.010         -0.8
s is -1001          0.378        0.332        0.046        -12.2
s == -1001          1.200        1.190        0.010         -0.8
s > -1001           1.200        1.180        0.020         -1.7
s is 34.7           0.370        0.325        0.045        -12.2
s == 34.7           1.620        1.590        0.030         -1.9
s > 34.7            1.600        1.590        0.010         -0.6
s is 'a b c'        0.369        0.328        0.041        -11.1
s == 'a b c'        0.475        0.476       -0.001          0.2
s > 'a b c'         0.559        0.563       -0.004          0.7
s is True           0.531        0.491        0.040         -7.5
s == True           1.400        1.390        0.010         -0.7
s > True            1.400        1.380        0.020         -1.4

s = 4
operation          before        after        delta         %chg
---------          ------        -----        -----         ----
s is 'abc'          0.369        0.325        0.044        -11.9
s == 'abc'          1.200        1.190        0.010         -0.8
s > 'abc'           1.200        1.190        0.010         -0.8
s is 4              0.353        0.353        0.000          0.0
s == 4              0.352        0.355       -0.003          0.9
s > 4               0.354        0.350        0.004         -1.1
s is -1001          0.347        0.350       -0.003          0.9
s == -1001          0.350        0.353       -0.003          0.9
s > -1001           0.346        0.345        0.001         -0.3
s is 34.7           0.367        0.327        0.040        -10.9
s == 34.7           0.773        0.769        0.004         -0.5
s > 34.7            0.771        0.772       -0.001          0.1
s is 'a b c'        0.370        0.327        0.043        -11.6
s == 'a b c'        1.200        1.190        0.010         -0.8
s > 'a b c'         1.200        1.190        0.010         -0.8
s is True           0.534        0.492        0.042         -7.9
s == True           0.905        0.911       -0.006          0.7
s > True            0.904        0.913       -0.009          1.0

s = None
operation          before        after        delta         %chg
---------          ------        -----        -----         ----
s is 'abc'          0.368        0.327        0.041        -11.1
s == 'abc'          0.962        0.950        0.012         -1.2
s > 'abc'           0.959        0.955        0.004         -0.4
s is 4              0.371        0.332        0.039        -10.5
s == 4              0.932        0.922        0.010         -1.1
s > 4               0.936        0.927        0.009         -1.0
s is -1001          0.370        0.330        0.040        -10.8
s == -1001          0.932        0.923        0.009         -1.0
s > -1001           0.935        0.925        0.010         -1.1
s is 34.7           0.368        0.325        0.043        -11.7
s == 34.7           1.110        1.110        0.000          0.0
s > 34.7            1.110        1.110        0.000          0.0
s is 'a b c'        0.370        0.325        0.045        -12.2
s == 'a b c'        0.963        0.948        0.015         -1.6
s > 'a b c'         0.961        0.949        0.012         -1.2
s is True           0.529        0.490        0.039         -7.4
s == True           1.110        1.110        0.000          0.0
s > True            1.120        1.110        0.010         -0.9

s = -1000
operation          before        after        delta         %chg
---------          ------        -----        -----         ----
s is 'abc'          0.371        0.326        0.045        -12.1
s == 'abc'          1.200        1.190        0.010         -0.8
s > 'abc'           1.200        1.190        0.010         -0.8
s is 4              0.349        0.350       -0.001          0.3
s == 4              0.347        0.353       -0.006          1.7
s > 4               0.349        0.347        0.002         -0.6
s is -1001          0.348        0.352       -0.004          1.1
s == -1001          0.349        0.352       -0.003          0.9
s > -1001           0.346        0.348       -0.002          0.6
s is 34.7           0.366        0.326        0.040        -10.9
s == 34.7           0.769        0.771       -0.002          0.3
s > 34.7            0.766        0.777       -0.011          1.4
s is 'a b c'        0.367        0.328        0.039        -10.6
s == 'a b c'        1.210        1.190        0.020         -1.7
s > 'a b c'         1.200        1.190        0.010         -0.8
s is True           0.536        0.490        0.046         -8.6
s == True           0.887        0.887        0.000          0.0
s > True            0.890        0.892       -0.002          0.2

s = 34.2
operation          before        after        delta         %chg
---------          ------        -----        -----         ----
s is 'abc'          0.369        0.327        0.042        -11.4
s == 'abc'          1.630        1.620        0.010         -0.6
s > 'abc'           1.640        1.620        0.020         -1.2
s is 4              0.372        0.332        0.040        -10.8
s == 4              0.791        0.795       -0.004          0.5
s > 4               0.797        0.798       -0.001          0.1
s is -1001          0.375        0.331        0.044        -11.7
s == -1001          0.792        0.792        0.000          0.0
s > -1001           0.790        0.791       -0.001          0.1
s is 34.7           0.367        0.482       -0.115         31.3
s == 34.7           1.080        0.536        0.544        -50.4
s > 34.7            0.560        0.621       -0.061         10.9
s is 'a b c'        0.387        0.337        0.050        -12.9
s == 'a b c'        1.760        1.710        0.050         -2.8
s > 'a b c'         1.710        1.680        0.030         -1.8
s is True           0.614        0.509        0.105        -17.1
s == True           1.050        1.020        0.030         -2.9
s > True            1.060        1.020        0.040         -3.8

s = 'a b c'
operation          before        after        delta         %chg
---------          ------        -----        -----         ----
s is 'abc'          0.379        0.345        0.034         -9.0
s == 'abc'          0.542        0.494        0.048         -8.9
s > 'abc'           0.586        0.593       -0.007          1.2
s is 4              0.430        0.344        0.086        -20.0
s == 4              1.260        1.230        0.030         -2.4
s > 4               1.370        1.230        0.140        -10.2
s is -1001          0.431        0.372        0.059        -13.7
s == -1001          1.250        1.640       -0.390         31.2
s > -1001           1.240        1.260       -0.020          1.6
s is 34.7           0.383        0.337        0.046        -12.0
s == 34.7           1.770        1.680        0.090         -5.1
s > 34.7            1.670        1.660        0.010         -0.6
s is 'a b c'        0.423        0.376        0.047        -11.1
s == 'a b c'        0.506        0.510       -0.004          0.8
s > 'a b c'         0.517        0.564       -0.047          9.1
s is True           0.550        0.514        0.036         -6.5
s == True           1.470        1.640       -0.170         11.6
s > True            1.450        1.430        0.020         -1.4

s = object()
operation          before        after        delta         %chg
---------          ------        -----        -----         ----
s is 'abc'          0.389        0.379        0.010         -2.6
s == 'abc'          1.220        1.370       -0.150         12.3
s > 'abc'           1.220        2.600       -1.380        113.1
s is 4              0.427        0.349        0.078        -18.3
s == 4              1.080        1.620       -0.540         50.0
s > 4               1.060        1.070       -0.010          0.9
s is -1001          0.437        0.343        0.094        -21.5
s == -1001          1.070        1.130       -0.060          5.6
s > -1001           1.060        1.090       -0.030          2.8
s is 34.7           0.419        0.338        0.081        -19.3
s == 34.7           1.710        1.520        0.190        -11.1
s > 34.7            1.520        1.540       -0.020          1.3
s is 'a b c'        0.380        0.347        0.033         -8.7
s == 'a b c'        2.020        1.210        0.810        -40.1
s > 'a b c'         1.260        1.210        0.050         -4.0
s is True           0.622        0.515        0.107        -17.2
s == True           1.220        1.220        0.000          0.0
s > True            1.210        1.210        0.000          0.0

s = []
operation          before        after        delta         %chg
---------          ------        -----        -----         ----
s is 'abc'          0.369        0.326        0.043        -11.7
s == 'abc'          1.220        1.200        0.020         -1.6
s > 'abc'           1.220        1.200        0.020         -1.6
s is 4              0.372        0.332        0.040        -10.8
s == 4              1.160        1.150        0.010         -0.9
s > 4               1.150        1.150        0.000          0.0
s is -1001          0.371        0.334        0.037        -10.0
s == -1001          1.150        1.140        0.010         -0.9
s > -1001           1.150        1.150        0.000          0.0
s is 34.7           0.368        0.326        0.042        -11.4
s == 34.7           1.500        1.480        0.020         -1.3
s > 34.7            1.490        1.490        0.000          0.0
s is 'a b c'        0.366        0.325        0.041        -11.2
s == 'a b c'        1.220        1.200        0.020         -1.6
s > 'a b c'         1.220        1.200        0.020         -1.6
s is True           0.531        0.484        0.047         -8.9
s == True           1.360        1.350        0.010         -0.7
s > True            1.350        1.350        0.000          0.0

I fully expected that the "is" tests would be faster and without 
question the "==" and ">" tests would be slower.  I was quite 
surprised that this wasn't always the case.  The above tests were 
run on an 800MHz Powerbook G4 running Mac OSX 10.2.8.  I don't 
have immediate access in Intel hardware, though I'll try to run 
these tests on cygwin this week.  

I'd be happy to be shown that my shell script isn't measuring what 
I think it's measuring as well.

Skip


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

Comment By: Raymond Hettinger (rhettinger)
Date: 2004-03-20 13:27

Message:
Logged In: YES 
user_id=80475

Even "is" and "is not" are not helped by more than a couple
of cycles.  This fragment essentially inlines part of code
for cmp_outcome().  Only the function call is saved.

It does slow down other code paths by introducing an
unpredictable branch.   

If the inlining were considered important, then the whole of
cmp_outcome() should be inlined.  Then, all comparisons save
a single call/return pair.  The cost is further increasing
the size of the eval loop.

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

Comment By: Tim Peters (tim_one)
Date: 2004-03-20 12:45

Message:
Logged In: YES 
user_id=31435

Well, there's little question that this will speed "is" and "is 
not", but it also slows all other cases by the cost of the 
switch-and-branch to determine that they're not the favored 
cases.  So why should we believe that speeding "is" and "is 
not" is more important than slowing other cases?

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

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



More information about the Patches mailing list