[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