From: Victor Stinner Date: Mon, 18 Nov 2013 20:08:39 +0000 (+0100) Subject: Issue #19581: Change the overallocation factor of _PyUnicodeWriter on Windows X-Git-Tag: v3.4.0b1~193 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6989ba01742a556ebc790b4786ba1d4f4ef78692;p=thirdparty%2FPython%2Fcpython.git Issue #19581: Change the overallocation factor of _PyUnicodeWriter on Windows On Windows, a factor of 50% gives best performances. --- diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index b2f488d1f259..bddfafd90f38 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -13106,6 +13106,13 @@ int _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer, Py_ssize_t length, Py_UCS4 maxchar) { +#ifdef MS_WINDOWS + /* On Windows, overallocate by 50% is the best factor */ +# define OVERALLOCATE_FACTOR 2 +#else + /* On Linux, overallocate by 25% is the best factor */ +# define OVERALLOCATE_FACTOR 4 +#endif Py_ssize_t newlen; PyObject *newbuffer; @@ -13121,9 +13128,10 @@ _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer, if (writer->buffer == NULL) { assert(!writer->readonly); - if (writer->overallocate && newlen <= (PY_SSIZE_T_MAX - newlen / 4)) { - /* overallocate 25% to limit the number of resize */ - newlen += newlen / 4; + if (writer->overallocate + && newlen <= (PY_SSIZE_T_MAX - newlen / OVERALLOCATE_FACTOR)) { + /* overallocate to limit the number of realloc() */ + newlen += newlen / OVERALLOCATE_FACTOR; } if (newlen < writer->min_length) newlen = writer->min_length; @@ -13133,9 +13141,10 @@ _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer, return -1; } else if (newlen > writer->size) { - if (writer->overallocate && newlen <= (PY_SSIZE_T_MAX - newlen / 4)) { - /* overallocate 25% to limit the number of resize */ - newlen += newlen / 4; + if (writer->overallocate + && newlen <= (PY_SSIZE_T_MAX - newlen / OVERALLOCATE_FACTOR)) { + /* overallocate to limit the number of realloc() */ + newlen += newlen / OVERALLOCATE_FACTOR; } if (newlen < writer->min_length) newlen = writer->min_length; @@ -13169,6 +13178,8 @@ _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer, } _PyUnicodeWriter_Update(writer); return 0; + +#undef OVERALLOCATE_FACTOR } Py_LOCAL_INLINE(int)