From: Antoine Pitrou Date: Tue, 17 Apr 2012 11:50:58 +0000 (+0200) Subject: Speed up reading of small files. This avoids multiple C read() calls on pyc files. X-Git-Tag: v3.3.0a3~180 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a3f4457b172a165fafa65d67e0293f89dbba06b7;p=thirdparty%2FPython%2Fcpython.git Speed up reading of small files. This avoids multiple C read() calls on pyc files. --- diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c index 34ff1e02ee13..df3affe1ee2d 100644 --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -572,6 +572,7 @@ new_buffersize(fileio *self, size_t currentsize #endif ) { + size_t addend; #ifdef HAVE_FSTAT if (end != (Py_off_t)-1) { /* Files claiming a size smaller than SMALLCHUNK may @@ -589,9 +590,16 @@ new_buffersize(fileio *self, size_t currentsize } #endif /* Expand the buffer by an amount proportional to the current size, - giving us amortized linear-time behavior. Use a less-than-double - growth factor to avoid excessive allocation. */ - return currentsize + (currentsize >> 3) + 6; + giving us amortized linear-time behavior. For bigger sizes, use a + less-than-double growth factor to avoid excessive allocation. */ + if (currentsize > 65536) + addend = currentsize >> 3; + else + addend = 256 + currentsize; + if (addend < SMALLCHUNK) + /* Avoid tiny read() calls. */ + addend = SMALLCHUNK; + return addend + currentsize; } static PyObject *