mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Issue #19581: Change the overallocation factor of _PyUnicodeWriter on Windows
On Windows, a factor of 50% gives best performances.
This commit is contained in:
parent
f47981f51e
commit
6989ba0174
1 changed files with 17 additions and 6 deletions
|
@ -13106,6 +13106,13 @@ int
|
||||||
_PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer,
|
_PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer,
|
||||||
Py_ssize_t length, Py_UCS4 maxchar)
|
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;
|
Py_ssize_t newlen;
|
||||||
PyObject *newbuffer;
|
PyObject *newbuffer;
|
||||||
|
|
||||||
|
@ -13121,9 +13128,10 @@ _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer,
|
||||||
|
|
||||||
if (writer->buffer == NULL) {
|
if (writer->buffer == NULL) {
|
||||||
assert(!writer->readonly);
|
assert(!writer->readonly);
|
||||||
if (writer->overallocate && newlen <= (PY_SSIZE_T_MAX - newlen / 4)) {
|
if (writer->overallocate
|
||||||
/* overallocate 25% to limit the number of resize */
|
&& newlen <= (PY_SSIZE_T_MAX - newlen / OVERALLOCATE_FACTOR)) {
|
||||||
newlen += newlen / 4;
|
/* overallocate to limit the number of realloc() */
|
||||||
|
newlen += newlen / OVERALLOCATE_FACTOR;
|
||||||
}
|
}
|
||||||
if (newlen < writer->min_length)
|
if (newlen < writer->min_length)
|
||||||
newlen = writer->min_length;
|
newlen = writer->min_length;
|
||||||
|
@ -13133,9 +13141,10 @@ _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else if (newlen > writer->size) {
|
else if (newlen > writer->size) {
|
||||||
if (writer->overallocate && newlen <= (PY_SSIZE_T_MAX - newlen / 4)) {
|
if (writer->overallocate
|
||||||
/* overallocate 25% to limit the number of resize */
|
&& newlen <= (PY_SSIZE_T_MAX - newlen / OVERALLOCATE_FACTOR)) {
|
||||||
newlen += newlen / 4;
|
/* overallocate to limit the number of realloc() */
|
||||||
|
newlen += newlen / OVERALLOCATE_FACTOR;
|
||||||
}
|
}
|
||||||
if (newlen < writer->min_length)
|
if (newlen < writer->min_length)
|
||||||
newlen = writer->min_length;
|
newlen = writer->min_length;
|
||||||
|
@ -13169,6 +13178,8 @@ _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer,
|
||||||
}
|
}
|
||||||
_PyUnicodeWriter_Update(writer);
|
_PyUnicodeWriter_Update(writer);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
#undef OVERALLOCATE_FACTOR
|
||||||
}
|
}
|
||||||
|
|
||||||
Py_LOCAL_INLINE(int)
|
Py_LOCAL_INLINE(int)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue