Patchwork [5,of,6,faster-obsmarkers,v2] obsolete: use parsers.fm1readmarker if it exists for a ~38% perf win

login
register
mail settings
Submitter Augie Fackler
Date Feb. 3, 2015, 6:31 p.m.
Message ID <5304a0b6970ce90636df.1422988273@arthedain.pit.corp.google.com>
Download mbox | patch
Permalink /patch/7641/
State Accepted
Commit 26d6a6a78c1d855e513626190bc80ffc5cadfc87
Headers show

Comments

Augie Fackler - Feb. 3, 2015, 6:31 p.m.
# HG changeset patch
# User Augie Fackler <augie@google.com>
# Date 1421779087 18000
#      Tue Jan 20 13:38:07 2015 -0500
# Node ID 5304a0b6970ce90636dfa2c48077d02ae2de5e8d
# Parent  45dc489152d8fe0c4c30cc59c5d3dff03f848a52
obsolete: use parsers.fm1readmarker if it exists for a ~38% perf win

This moves perfloadmarkers on my linux workstation (63494 markers from
mpm, crew, and myself) performance from
! wall 0.357657 comb 0.360000 user 0.350000 sys 0.010000 (best of 28)
to
! wall 0.222345 comb 0.220000 user 0.210000 sys 0.010000 (best of 41)
which is a pretty good improvement.

On my BSD machine, which is ancient and slow, before:
! wall 3.584964 comb 3.578125 user 3.539062 sys 0.039062 (best of 3)
after:
! wall 2.267974 comb 2.265625 user 2.195312 sys 0.070312 (best of 5)


I feel like we could do better by moving the whole generator function
into C, but I didn't want to tackle that right away.

Patch

diff --git a/mercurial/obsolete.py b/mercurial/obsolete.py
--- a/mercurial/obsolete.py
+++ b/mercurial/obsolete.py
@@ -68,7 +68,7 @@  comment associated with each format for 
 
 """
 import struct
-import util, base85, node
+import util, base85, node, parsers
 import phases
 from i18n import _
 
@@ -301,6 +301,15 @@  def _fm1readmarkers(data, off):
     # Loop on markers
     stop = len(data) - _fm1fsize
     ufixed = util.unpacker(_fm1fixed)
+
+    fast = getattr(parsers, 'fm1readmarker', None)
+    if fast is not None:
+        while off <= stop:
+            ret = fast(data, off)
+            yield ret[1:]
+            off += ret[0]
+        return
+
     while off <= stop:
         # read fixed part
         o1 = off + fsize