[Python-checkins] cpython: Issue #19581: Change the overallocation factor of _PyUnicodeWriter on Windows

victor.stinner python-checkins at python.org
Mon Nov 18 21:19:07 CET 2013


http://hg.python.org/cpython/rev/093b9838a41c
changeset:   87249:093b9838a41c
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Mon Nov 18 21:08:39 2013 +0100
summary:
  Issue #19581: Change the overallocation factor of _PyUnicodeWriter on Windows

On Windows, a factor of 50% gives best performances.

files:
  Objects/unicodeobject.c |  23 +++++++++++++++++------
  1 files changed, 17 insertions(+), 6 deletions(-)


diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -13106,6 +13106,13 @@
 _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 @@
 
     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 @@
             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_Update(writer);
     return 0;
+
+#undef OVERALLOCATE_FACTOR
 }
 
 Py_LOCAL_INLINE(int)

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list