From a3f4457b172a165fafa65d67e0293f89dbba06b7 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Tue, 17 Apr 2012 13:50:58 +0200 Subject: [PATCH] Speed up reading of small files. This avoids multiple C read() calls on pyc files. --- Modules/_io/fileio.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c index 34ff1e02ee1..df3affe1ee2 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 *