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
--- 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