Issue3106
This issue tracker has been migrated to GitHub,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2008-06-13 18:38 by pitrou, last changed 2022-04-11 14:56 by admin. This issue is now closed.
Files | ||||
---|---|---|---|---|
File name | Uploaded | Description | Edit | |
cpms.patch | pitrou, 2008-06-13 18:37 | |||
cmps4.patch | pitrou, 2008-11-16 20:37 | |||
cmps5.patch | pitrou, 2008-12-13 15:07 |
Messages (11) | |||
---|---|---|---|
msg68174 - (view) | Author: Antoine Pitrou (pitrou) * | Date: 2008-06-13 18:37 | |
This patch is an experiment in making faster some of the most common comparisons (str vs. str, int vs. int). I don't know if it may bring noticeable speedups in real-world situations, but here are the synthetic benchmark numbers (from pybench, "this" is the patched version and "other" is vanilla py3k): Test minimum run-time average run-time this other diff this other diff ------------------------------------------------------------------------------- CompareFloats: 182ms 173ms +5.4% 182ms 176ms +3.4% CompareFloatsIntegers: 238ms 232ms +2.3% 242ms 236ms +2.5% CompareIntegers: 237ms 277ms -14.4% 237ms 280ms -15.2% CompareInternedStrings: 163ms 257ms -36.7% 163ms 258ms -36.7% CompareLongs: 137ms 160ms -14.5% 137ms 162ms -15.6% CompareStrings: 149ms 170ms -12.1% 154ms 170ms -9.5% ------------------------------------------------------------------------------- Totals: 1105ms 1268ms -12.9% 1115ms 1281ms -13.0% |
|||
msg69609 - (view) | Author: Antoine Pitrou (pitrou) * | Date: 2008-07-13 13:00 | |
Raymond, would you want to take a look? |
|||
msg75940 - (view) | Author: Raymond Hettinger (rhettinger) * | Date: 2008-11-16 15:13 | |
You may get better timings if you more the types-are-equal test inside the types-i-know test. Instead of: + if (Py_TYPE(v) == Py_TYPE(w)) { + if (PyLong_CheckExact(v)) { + if (v == w) + break; + return PyLong_RichCompare(v, w, op); + } + if (PyUnicode_CheckExact(v)) { Do something like: + if (PyLong_CheckExact(v)) { + if (Py_TYPE(v) == Py_TYPE(w)) { + if (v == w) + break; + return PyLong_RichCompare(v, w, op); + } + if (PyUnicode_CheckExact(v)) { + if (Py_TYPE(v) == Py_TYPE(w)) { In general, I'm not too keen on adding this kind of dispatch code to ceval.c. It saves the time spent in PyObject_RichCompare() trying to figure out where to delegate the work. But it comes at the expense of weighing down ALL of the other comparisons which haven't gotten a short-cut specialization. |
|||
msg75943 - (view) | Author: Antoine Pitrou (pitrou) * | Date: 2008-11-16 20:37 | |
Hello, > You may get better timings if you more the types-are-equal test inside > the types-i-know test. I get no discernable difference. > In general, I'm not too keen on adding this kind of dispatch code to > ceval.c. It saves the time spent in PyObject_RichCompare() trying to > figure out where to delegate the work. Some minimal type testing is necessary if we want to implement the identity-implies-equality optimization for some types without breaking the fact that e.g. NaN != NaN. This optimization is important when dealing with e.g. interned strings. There could be a special flag in the type structure signaling that the optimization is safe. I'm attaching a patch which reduces the additional dispatch to a minimum. The speedup on pybench is smaller, but there is no significant slowdown for "other" comparisons. Test minimum run-time average run-time this other diff this other diff ------------------------------------------------------------------------------- CompareFloats: 176ms 173ms +1.9% 180ms 175ms +3.2% CompareFloatsIntegers: 237ms 234ms +1.0% 251ms 240ms +4.6% CompareIntegers: 266ms 276ms -3.6% 266ms 278ms -4.3% CompareInternedStrings: 160ms 261ms -38.6% 161ms 261ms -38.4% CompareLongs: 156ms 166ms -6.1% 156ms 167ms -7.1% CompareStrings: 167ms 172ms -2.9% 170ms 173ms -1.9% ------------------------------------------------------------------------------- Totals: 1161ms 1281ms -9.4% 1184ms 1295ms -8.6% |
|||
msg77744 - (view) | Author: Antoine Pitrou (pitrou) * | Date: 2008-12-13 15:07 | |
Here is a new patch without any dispatch shortcut in ceval.c, just optimizations in unicodeobject.c and longobject.c. Net result on pybench: Test minimum run-time average run-time this other diff this other diff ------------------------------------------------------------------------------- CompareFloats: 166ms 170ms -2.3% 169ms 174ms -2.8% CompareFloatsIntegers: 230ms 231ms -0.7% 233ms 231ms +0.8% CompareIntegers: 247ms 270ms -8.7% 248ms 272ms -9.0% CompareInternedStrings: 196ms 254ms -22.7% 197ms 255ms -22.7% CompareLongs: 143ms 158ms -9.0% 143ms 158ms -9.3% CompareStrings: 156ms 168ms -7.4% 157ms 169ms -7.2% ------------------------------------------------------------------------------- Totals: 1139ms 1252ms -9.1% 1148ms 1260ms -8.9% The patch seems fairly uncontroversial to me, I'll commit it soon if there's no opposition. |
|||
msg77749 - (view) | Author: Raymond Hettinger (rhettinger) * | Date: 2008-12-13 16:03 | |
If there's not a hurry, would like to review this a bit more when I get back early next week. |
|||
msg77753 - (view) | Author: Antoine Pitrou (pitrou) * | Date: 2008-12-13 16:14 | |
> If there's not a hurry, would like to review this a bit more when I get > back early next week. No pb! |
|||
msg77870 - (view) | Author: Marc-Andre Lemburg (lemburg) * | Date: 2008-12-15 14:41 | |
On 2008-12-13 16:08, Antoine Pitrou wrote: > Antoine Pitrou <pitrou@free.fr> added the comment: > > Here is a new patch without any dispatch shortcut in ceval.c, just > optimizations in unicodeobject.c and longobject.c. Net result on pybench: > > Test minimum run-time average run-time > this other diff this other > diff > ------------------------------------------------------------------------------- > CompareFloats: 166ms 170ms -2.3% 169ms 174ms > -2.8% > CompareFloatsIntegers: 230ms 231ms -0.7% 233ms 231ms > +0.8% > CompareIntegers: 247ms 270ms -8.7% 248ms 272ms > -9.0% > CompareInternedStrings: 196ms 254ms -22.7% 197ms 255ms > -22.7% > CompareLongs: 143ms 158ms -9.0% 143ms 158ms > -9.3% > CompareStrings: 156ms 168ms -7.4% 157ms 169ms > -7.2% > ------------------------------------------------------------------------------- > Totals: 1139ms 1252ms -9.1% 1148ms 1260ms > -8.9% > > > The patch seems fairly uncontroversial to me, I'll commit it soon if > there's no opposition. Why have you removed the complete error handling section in PyUnicode_RichCompare() ? > Added file: http://bugs.python.org/file12341/cmps5.patch |
|||
msg77873 - (view) | Author: Antoine Pitrou (pitrou) * | Date: 2008-12-15 15:34 | |
Le lundi 15 décembre 2008 à 14:41 +0000, Marc-Andre Lemburg a écrit : > Why have you removed the complete error handling section in > PyUnicode_RichCompare() ? Because the only error that can occur is a TypeError when one of the two arguments is not an unicode object, and that is handled by returning Py_NotImplemented at the end. (there is no implicit bytes -> unicode coercion anymore, and therefore things are much simpler) |
|||
msg77880 - (view) | Author: Marc-Andre Lemburg (lemburg) * | Date: 2008-12-15 19:27 | |
On 2008-12-15 16:34, Antoine Pitrou wrote: > Antoine Pitrou <pitrou@free.fr> added the comment: > > Le lundi 15 décembre 2008 à 14:41 +0000, Marc-Andre Lemburg a écrit : >> Why have you removed the complete error handling section in >> PyUnicode_RichCompare() ? > > Because the only error that can occur is a TypeError when one of the two > arguments is not an unicode object, and that is handled by returning > Py_NotImplemented at the end. > (there is no implicit bytes -> unicode coercion anymore, and therefore > things are much simpler) Ah, sorry, just saw that this is just for Py3. The fast-path would probably also make sense for Py2 (keeping the error handling, of course). |
|||
msg78100 - (view) | Author: Antoine Pitrou (pitrou) * | Date: 2008-12-20 13:23 | |
I committed the patch, which will also help #1717. Thanks! |
History | |||
---|---|---|---|
Date | User | Action | Args |
2022-04-11 14:56:35 | admin | set | github: 47356 |
2008-12-20 13:23:49 | pitrou | set | status: open -> closed resolution: fixed messages: + msg78100 |
2008-12-15 19:27:57 | lemburg | set | messages: + msg77880 |
2008-12-15 15:34:39 | pitrou | set | messages: + msg77873 |
2008-12-15 14:41:25 | lemburg | set | nosy:
+ lemburg messages: + msg77870 |
2008-12-13 16:14:14 | pitrou | set | messages: + msg77753 |
2008-12-13 16:03:36 | rhettinger | set | messages: + msg77749 |
2008-12-13 15:07:31 | pitrou | set | files:
+ cmps5.patch messages: + msg77744 |
2008-11-16 20:37:10 | pitrou | set | files:
+ cmps4.patch messages: + msg75943 |
2008-11-16 15:13:32 | rhettinger | set | messages: + msg75940 |
2008-07-14 13:28:44 | rhettinger | set | assignee: rhettinger |
2008-07-13 13:00:50 | pitrou | set | nosy:
+ rhettinger messages: + msg69609 |
2008-06-13 18:38:02 | pitrou | create |