Mercurial > hg
changeset 33799:05264fc9d8d6
util: make nogc effective for CPython
279cd80059d4 made `util.nogc` a no-op. It was to optimize PyPy. But it slows
down CPython if many objects (like 300k+) are created.
For example, running `hg log -r .` without extensions in `hg-committed` with
14k+ obsmarkers have the following times:
before | after
hg | chg | hg | chg
-----------------------------
1.262 | 0.860 | 1.077 | 0.619 (seconds, best of 20 runs)
Therefore let's re-enable nogc for CPython.
Differential Revision: https://phab.mercurial-scm.org/D402
author | Jun Wu <quark@fb.com> |
---|---|
date | Mon, 14 Aug 2017 22:28:59 -0700 |
parents | 2cd5aba5e1d2 |
children | f257943e47ab |
files | mercurial/util.py |
diffstat | 1 files changed, 6 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/util.py Wed Jul 26 23:47:54 2017 -0400 +++ b/mercurial/util.py Mon Aug 14 22:28:59 2017 -0700 @@ -964,10 +964,9 @@ into. As a workaround, disable GC while building complex (huge) containers. - This garbage collector issue have been fixed in 2.7. + This garbage collector issue have been fixed in 2.7. But it still affect + CPython's performance. """ - if sys.version_info >= (2, 7): - return func def wrapper(*args, **kwargs): gcenabled = gc.isenabled() gc.disable() @@ -978,6 +977,10 @@ gc.enable() return wrapper +if pycompat.ispypy: + # PyPy runs slower with gc disabled + nogc = lambda x: x + def pathto(root, n1, n2): '''return the relative path from one place to another. root should use os.sep to separate directories