[PATCH] convert: when getting file from Perforce concatenate data at the end

Eugene Baranov eug.baranov at gmail.com
Thu Jul 30 13:12:17 CDT 2015


Apologies - I forgot to flag it for stable!

On 30 July 2015 at 00:58, Eugene Baranov <eug.baranov at gmail.com> wrote:
> # HG changeset patch
> # User Eugene Baranov <eug.baranov at gmail.com>
> # Date 1438214285 -3600
> #      Thu Jul 30 00:58:05 2015 +0100
> # Branch stable
> # Node ID ced462474db13d175e76168014e94ea7be40b764
> # Parent  7d2b42b3a15039ac01c218ce8e9d04854f8a7e02
> convert: when getting file from Perforce concatenate data at the end
>
> As it turned out, even when getting relatively small files, concatenating
> string data every time when new chunk is received is very inefficient.
> Maintaining a string list of data chunks and concatenating everything in one go
> at the end seems much more efficient - in my testing it made getting 40 MB file
> 7 times faster, whilst converting of a particularly big changelist with some big
> files went down from 20 hours to 3 hours.
>
> diff -r 7d2b42b3a150 -r ced462474db1 hgext/convert/p4.py
> --- a/hgext/convert/p4.py       Fri Jul 24 15:10:18 2015 +0100
> +++ b/hgext/convert/p4.py       Thu Jul 30 00:58:05 2015 +0100
> @@ -304,7 +304,7 @@
>              stdout = self.p4.runcommand(cmd)
>
>              mode = None
> -            contents = ""
> +            contents = []
>              keywords = None
>
>              for d in loaditer(stdout):
> @@ -340,7 +340,7 @@
>                              keywords = self.re_keywords
>
>                  elif code == "text" or code == "binary":
> -                    contents += data
> +                    contents.append(data)
>
>                  lasterror = None
>
> @@ -350,6 +350,8 @@
>          if mode is None:
>              return None, None
>
> +        contents = ''.join(contents)
> +
>          if keywords:
>              contents = keywords.sub("$\\1$", contents)
>          if mode == "l" and contents.endswith("\n"):


More information about the Mercurial-devel mailing list