# HG changeset patch # User Jun Wu # Date 1502774939 25200 # Node ID 05264fc9d8d64159ab942c1bde400238f2c0ec88 # Parent 2cd5aba5e1d2a94ee89838e57ca66aab68e27f56 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 diff -r 2cd5aba5e1d2 -r 05264fc9d8d6 mercurial/util.py --- 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