<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Mar 7, 2016 at 9:44 PM, Martin von Zweigbergk <span dir="ltr"><<a href="mailto:martinvonz@google.com" target="_blank">martinvonz@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">What do you think about folding in the following? Seems correct? Would<br>
it be noticeably slower with the extra array slicing?<br>
<br>
diff -r 18f6505b3b79 mercurial/changelog.py<br>
--- a/mercurial/changelog.py    Sun Mar 06 14:31:06 2016 -0800<br>
+++ b/mercurial/changelog.py    Mon Mar 07 21:37:24 2016 -0800<br>
@@ -196,12 +196,7 @@ class changelogrevision(object):<br>
<span class="">         nl3 = text.index('\n', nl2 + 1)<br>
         self._rawdateextra = text[nl2 + 1:nl3]<br>
<br>
</span>-        # The list of files may be empty. Which means nl3 is the first of the<br>
-        # double newline that precedes the description.<br>
-        if nl3 == doublenl:<br>
-            self._rawfiles = None<br>
-        else:<br>
-            self._rawfiles = text[nl3 + 1:doublenl]<br>
+        self._rawfiles = text[nl3:doublenl]<br>
<br>
         return self<br>
<br>
@@ -247,10 +242,7 @@ class changelogrevision(object):<br>
<br>
     @property<br>
     def files(self):<br>
-        if self._rawfiles is None:<br>
-            return []<br>
-<br>
-        return self._rawfiles.split('\n')<br>
+        return self._rawfiles.split('\n')[1:]<br>
<br>
     @property<br>
     def description(self):<br>
<div><div class="h5"><br></div></div></blockquote><div><br></div><div>I like the shorter code. If you measure this to have no performance impact, I'm fine with it. I suppose we could always do it as a follow-up.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
<br>
<br>
On Sun, Mar 6, 2016 at 3:58 PM, Gregory Szorc <<a href="mailto:gregory.szorc@gmail.com">gregory.szorc@gmail.com</a>> wrote:<br>
> # HG changeset patch<br>
> # User Gregory Szorc <<a href="mailto:gregory.szorc@gmail.com">gregory.szorc@gmail.com</a>><br>
> # Date 1457303466 28800<br>
> #      Sun Mar 06 14:31:06 2016 -0800<br>
> # Node ID e37bac9adf9215f82850e7b105e3e47e1bee3d7a<br>
> # Parent  7559d2bcdaeb320212bf8d37e0e5e2075dec6d18<br>
> changelog: lazily parse files<br>
><br>
> More of the same.<br>
><br>
> Again, modest revset performance wins:<br>
><br>
> author(mpm)<br>
> 0.896565<br>
> 0.822961<br>
> 0.805156<br>
><br>
> desc(bug)<br>
> 0.887169<br>
> 0.847054<br>
> 0.798101<br>
><br>
> date(2015)<br>
> 0.878797<br>
> 0.811613<br>
> 0.786689<br>
><br>
> extra(rebase_source)<br>
> 0.865446<br>
> 0.797756<br>
> 0.777408<br>
><br>
>  author(mpm) or author(greg)<br>
> 1.801832<br>
> 1.668172<br>
> 1.626547<br>
><br>
> author(mpm) or desc(bug)<br>
> 1.812438<br>
> 1.677608<br>
> 1.613941<br>
><br>
> date(2015) or branch(default)<br>
> 0.968276<br>
> 0.896032<br>
> 0.869017<br>
><br>
> diff --git a/mercurial/changelog.py b/mercurial/changelog.py<br>
> --- a/mercurial/changelog.py<br>
> +++ b/mercurial/changelog.py<br>
> @@ -148,17 +148,17 @@ class changelogrevision(object):<br>
>      Changelog revisions consist of multiple pieces of data, including<br>
>      the manifest node, user, and date. This object exposes a view into<br>
>      the parsed object.<br>
>      """<br>
><br>
>      __slots__ = (<br>
>          '_rawdateextra',<br>
>          '_rawdesc',<br>
> -        'files',<br>
> +        '_rawfiles',<br>
>          '_rawmanifest',<br>
>          '_rawuser',<br>
>      )<br>
><br>
>      def __new__(cls, text):<br>
>          if not text:<br>
>              return _changelogrevision(<br>
>                  manifest=nullid,<br>
> @@ -191,18 +191,22 @@ class changelogrevision(object):<br>
>          self._rawmanifest = text[0:nl1]<br>
><br>
>          nl2 = text.index('\n', nl1 + 1)<br>
>          self._rawuser = text[nl1 + 1:nl2]<br>
><br>
>          nl3 = text.index('\n', nl2 + 1)<br>
>          self._rawdateextra = text[nl2 + 1:nl3]<br>
><br>
> -        l = text[:doublenl].split('\n')<br>
> -        self.files = l[3:]<br>
> +        # The list of files may be empty. Which means nl3 is the first of the<br>
> +        # double newline that precedes the description.<br>
> +        if nl3 == doublenl:<br>
> +            self._rawfiles = None<br>
> +        else:<br>
> +            self._rawfiles = text[nl3 + 1:doublenl]<br>
><br>
>          return self<br>
><br>
>      @property<br>
>      def manifest(self):<br>
>          return bin(self._rawmanifest)<br>
><br>
>      @property<br>
> @@ -237,16 +241,23 @@ class changelogrevision(object):<br>
>      def extra(self):<br>
>          raw = self._rawextra<br>
>          if raw is None:<br>
>              return _defaultextra<br>
><br>
>          return decodeextra(raw)<br>
><br>
>      @property<br>
> +    def files(self):<br>
> +        if self._rawfiles is None:<br>
> +            return []<br>
> +<br>
> +        return self._rawfiles.split('\n')<br>
> +<br>
> +    @property<br>
>      def description(self):<br>
>          return encoding.tolocal(self._rawdesc)<br>
><br>
>  class changelog(revlog.revlog):<br>
>      def __init__(self, opener):<br>
>          revlog.revlog.__init__(self, opener, "00changelog.i")<br>
>          if self._initempty:<br>
>              # changelogs don't benefit from generaldelta<br>
</div></div>> _______________________________________________<br>
> Mercurial-devel mailing list<br>
> <a href="mailto:Mercurial-devel@mercurial-scm.org">Mercurial-devel@mercurial-scm.org</a><br>
> <a href="https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel" rel="noreferrer" target="_blank">https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel</a><br>
</blockquote></div><br></div></div>