[pypy-svn] r55026 - pypy/branch/hybrid-io/pypy/rpython/lltypesystem

arigo at codespeak.net arigo at codespeak.net
Tue May 20 18:12:29 CEST 2008


Author: arigo
Date: Tue May 20 18:12:28 2008
New Revision: 55026

Modified:
   pypy/branch/hybrid-io/pypy/rpython/lltypesystem/rbuilder.py
Log:
(fijal, arigo)
Tweak the reallocation logic to grow geometrically,
like e.g. the reallocation of lists.


Modified: pypy/branch/hybrid-io/pypy/rpython/lltypesystem/rbuilder.py
==============================================================================
--- pypy/branch/hybrid-io/pypy/rpython/lltypesystem/rbuilder.py	(original)
+++ pypy/branch/hybrid-io/pypy/rpython/lltypesystem/rbuilder.py	Tue May 20 18:12:28 2008
@@ -5,13 +5,27 @@
      string_repr, unichar_repr, unicode_repr
 from pypy.rpython.annlowlevel import llstr
 from pypy.rlib import rgc
+from pypy.rlib.rarithmetic import ovfcheck
 from pypy.rpython.lltypesystem.lltype import staticAdtMethod
 from pypy.tool.sourcetools import func_with_new_name
 
+GROW_FAST_UNTIL = 100*1024*1024      # 100 MB
+
 def new_grow_func(name):
     def stringbuilder_grow(ll_builder, needed):
-        # XXX tweak overallocation scheme
-        new_allocated = ll_builder.allocated + needed + 100
+        allocated = ll_builder.allocated
+        if allocated < GROW_FAST_UNTIL:
+            new_allocated = allocated << 1
+        else:
+            extra_size = allocated >> 2
+            try:
+                new_allocated = ovfcheck(allocated + extra_size)
+            except OverflowError:
+                raise MemoryError
+        try:
+            new_allocated = ovfcheck(new_allocated + needed)
+        except OverflowError:
+            raise MemoryError
         ll_builder.buf = rgc.resize_buffer(ll_builder.buf, ll_builder.used,
                                            new_allocated)
         ll_builder.allocated = new_allocated



More information about the Pypy-commit mailing list