Issue 13623: Bytes performance regression in python3.3 vs python3.2 (original) (raw)

This issue has been migrated to GitHub: https://github.com/python/cpython/issues/57832

classification

Title: Bytes performance regression in python3.3 vs python3.2
Type: performance Stage:
Components: Benchmarks Versions: Python 3.2, Python 3.3

process

Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: collinwinter Nosy List: Boris.FELD, collinwinter, ezio.melotti, flox, python-dev, vstinner
Priority: normal Keywords: patch

Created on 2011-12-17 18:22 by Boris.FELD, last changed 2022-04-11 14:57 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
stringbench_log_cpython3.2 Boris.FELD,2011-12-17 18:22 Stringbenchmark log for cpython3.2
compare.py Boris.FELD,2011-12-17 18:23 Script used to compute diff between two runs
stringbench_log_cpython3.3 Boris.FELD,2011-12-17 18:25 String benchmark log for cpython3.3
bytes_find.patch vstinner,2011-12-17 23:33 review
bytes_find-2.patch vstinner,2011-12-18 00:03 review
Messages (7)
msg149689 - (view) Author: Boris FELD (Boris.FELD) * Date: 2011-12-17 18:22
Hello everyone, I juste tried to launch the stringbench on python3.2 and python3.3 dev versions and some bytes tests run slower in python3.3 than in python3.2. I cc the two raw output of both runs. I also extracted most interesting data (all the tests with more than 20% of performance regression): - (b"A"*1000).rfind(b"A") (*1000): -70.103093% - (b"A"*1000).find(b"B") (*1000): -48.372093% - (b"A"*1000).rindex(b"A") (*1000): -68.888889% - s=b"ABC"*33; (s+b"E"+(b"D"+s)*500).rfind(s+b"E") (*100): -28.982301% - (b"C"+b"AB"*300).rfind(b"CA") (*1000): -29.565217% - (b"AB"*1000).index(b"AB") (*1000): -68.539326% - b"Andrew".endswith(b"w") (*1000): -21.212121% - (b"A"*1000).index(b"A") (*1000): -71.111111% - (b"BC"+b"AB"*300).rfind(b"BC") (*1000): -42.788462% - b"Andrew".startswith(b"Andrew") (*1000): -20.588235% - (b"AB"*1000).find(b"AB") (*1000): -69.318182% - (b"AB"*1000).rfind(b"AB") (*1000): -69.791667% - (b"A"*1000).rfind(b"B") (*1000): -37.988827% - (b"AB"*300+"C").index(b"BC") (*1000): -28.750000% - b"B" in b"A"*1000 (*1000): -24.479167% - (b"AB"*300+"CA").find(b"CA") (*1000): -33.673469% - (b"AB"*1000).rindex(b"AB") (*1000): -67.777778% - (b"C"+"AB"*300).rindex(b"CA") (*1000): -29.017857% - (b"AB"*300+"C").find(b"BC") (*1000): -28.451883% - b"Andrew".startswith(b"A") (*1000): -21.212121% - b"Andrew".startswith(b"Anders") (*1000): -21.212121% - (b"A"*1000).partition(b"B") (*1000): -30.656934% - (b"AB"*1000).rfind(b"CA") (*1000): -20.603015% - (b"AB"*1000).rfind(b"BC") (*1000): -35.645472% - (b"A"*1000).find(b"A") (*1000): -70.454545% My environment is: Mac OS X 10.6.8 GCC i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3) CPython3.3 revision ea421c534305 CPython3.2 revision 0b86da9d6964
msg149691 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2011-12-17 18:42
Grouped results. find (first): - (b"A"*1000).find(b"A") : -70% - (b"A"*1000).rfind(b"A") : -70% - (b"A"*1000).index(b"A") : -71% - (b"A"*1000).rindex(b"A") : -68% - (b"AB"*1000).index(b"AB") : -68% - (b"AB"*1000).rindex(b"AB"): -67% - (b"AB"*1000).find(b"AB") : -69% - (b"AB"*1000).rfind(b"AB") : -69% - b"Andrew".startswith(b"Andrew"): -20% - b"Andrew".startswith(b"A") : -21% - b"Andrew".startswith(b"Anders"): -21% - b"Andrew".endswith(b"w"): -21% find (last): - (b"AB"*300+"CA").find(b"CA") : -33% - (b"C"+"AB"*300).rindex(b"CA") : -29% - (b"AB"*300+"C").find(b"BC") : -28% - (b"AB"*300+"C").index(b"BC") : -28% - (b"C"+b"AB"*300).rfind(b"CA") : -29% - (b"BC"+b"AB"*300).rfind(b"BC"): -42% - s=b"ABC"*33; (s+b"E"+(b"D"+s)*500).rfind(s+b"E"): -28% find (not found): - (b"A"*1000).find(b"B") : -48% - (b"A"*1000).rfind(b"B") : -37% - (b"AB"*1000).rfind(b"CA") : -20% - (b"AB"*1000).rfind(b"BC") : -35% others: - b"B" in b"A"*1000 : -24% - (b"A"*1000).partition(b"B") : -30%
msg149693 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2011-12-17 18:43
See also the issue #13621 for results on Unicode.
msg149718 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2011-12-17 23:33
> (b"A"*1000).find(b"A") : -70% This one is a performance regression introduced by #12170. Attached patch checks object type before trying a conversion to size_t instead of catching an exception.
msg149720 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2011-12-18 00:00
bytes_find.patch only works for Python int, not object with the __index__ method. My new patch (bytes_find-2.patch) uses PyNumber_Check() instead of PyLong_Check() to be more generic. It fixes also a different issue: raise the same ValueError than bytes.find(-1) on overflow error.
msg149721 - (view) Author: Roundup Robot (python-dev) (Python triager) Date: 2011-12-18 00:17
New changeset 75648db1b3f3 by Victor Stinner in branch 'default': Issue #13623: Fix a performance regression introduced by issue #12170 in http://hg.python.org/cpython/rev/75648db1b3f3
msg149725 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2011-12-18 00:29
I checked stringbench: there is no more performance regression (difference of more than 20%).
History
Date User Action Args
2022-04-11 14:57:24 admin set github: 57832
2011-12-18 00:29:18 vstinner set status: open -> closedresolution: fixedmessages: +
2011-12-18 00:17:54 python-dev set nosy: + python-devmessages: +
2011-12-18 00:03:27 vstinner set files: + bytes_find-2.patch
2011-12-18 00:03:17 vstinner set files: - bytes_find-2.patch
2011-12-18 00:00:05 vstinner set files: + bytes_find-2.patchmessages: +
2011-12-17 23:33:02 vstinner set files: + bytes_find.patchkeywords: + patchmessages: +
2011-12-17 19:02:28 ezio.melotti set nosy: + ezio.melotti
2011-12-17 18:56:22 vstinner set nosy: + flox
2011-12-17 18:43:06 vstinner set messages: +
2011-12-17 18:42:05 vstinner set nosy: + vstinnermessages: +
2011-12-17 18:25:58 Boris.FELD set files: + stringbench_log_cpython3.3
2011-12-17 18:25:46 Boris.FELD set files: - iobench_log_python3.3
2011-12-17 18:23:38 Boris.FELD set files: + compare.py
2011-12-17 18:23:24 Boris.FELD set files: + iobench_log_python3.3
2011-12-17 18:22:48 Boris.FELD create