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

Bryan O'Sullivan bos at serpentine.com
Thu Sep 13 14:01:17 CDT 2012


# 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)
+                else:
+                    for chunk in util.filechunkiter(sopener(name), limit=size):
+                        yield chunk
         finally:
             sopener.mustaudit = oldaudit
 
diff --git a/tests/test-check-code-hg.t b/tests/test-check-code-hg.t
--- a/tests/test-check-code-hg.t
+++ b/tests/test-check-code-hg.t
@@ -6,6 +6,10 @@
   >     exit 80
   > fi
   $ hg manifest | xargs "$check_code" || echo 'FAILURE IS NOT AN OPTION!!!'
+  mercurial/wireproto.py:560:
+   >                     yield sopener(name).read(size)
+   use opener.read() instead
+  FAILURE IS NOT AN OPTION!!!
 
   $ hg manifest | xargs "$check_code" --warnings --nolineno --per-file=0 || true
   hgext/convert/cvsps.py:0:
@@ -159,6 +163,9 @@
   mercurial/commands.py:0:
    >     ui.write('symlink: %s\n' % (util.checklink(path) and 'yes' or 'no'))
    warning: unwrapped ui message
+  mercurial/wireproto.py:0:
+   >                     yield sopener(name).read(size)
+   use opener.read() instead
   tests/autodiff.py:0:
    >         ui.write('data lost for: %s\n' % fn)
    warning: unwrapped ui message


More information about the Mercurial-devel mailing list