[PATCH 04 of 10] wireproto: bypass filechunkiter for small files when streaming

Greg Ward greg at gerg.ca
Thu Sep 13 20:16:21 CDT 2012


On 13 September 2012, Bryan O'Sullivan said:
> # HG changeset patch
> # User Bryan O'Sullivan <bryano at fb.com>
> # Date 1347562629 25200
> # Node ID 8a634678f1ddf810c61b66752b732e69abd265e8
> # Parent  f85d5c5b428594aeccc4ce0a81786f53eea9039c
> wireproto: bypass filechunkiter for small files when streaming
> 
> Merely creating and using a generator has a measurable impact,
> particularly since the common case for stream_out is generators that
> yield just once.  Avoiding generators improves stream_out performance
> by about 7%.
> 
> diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py
> --- a/mercurial/wireproto.py
> +++ b/mercurial/wireproto.py
> @@ -556,8 +556,11 @@
>                  repo.ui.debug('sending %s (%d bytes)\n' % (name, size))
>                  # partially encode name over the wire for backwards compat
>                  yield '%s\0%d\n' % (store.encodedir(name), size)
> -                for chunk in util.filechunkiter(sopener(name), limit=size):
> -                    yield chunk
> +                if size <= 65536:
> +                    yield sopener(name).read(size)

A comment would be nice here: "avoid overhead of creating a generator
that will yield just once".

Also, where does 65536 come from? (Please don't say "two to the
sixteenth power". ;-) Is that knowledge duplicated from
util.filechunkiter() or somewhere else? I'm not dogmatic about magic
numbers, but this sure looks like one.

       Greg


More information about the Mercurial-devel mailing list