]> git.eshelyaron.com Git - emacs.git/commitdiff
* src/insdel.c (make_gap): Increase enough to avoid O(N^2) behavior.
authorStefan Monnier <monnier@iro.umontreal.ca>
Sun, 19 Feb 2017 18:12:16 +0000 (13:12 -0500)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sun, 19 Feb 2017 18:12:16 +0000 (13:12 -0500)
src/insdel.c

index 3f933b0ad858c1d1bd6844301909673a69327247..8b684fd278039a00c6ff0a0fca8f120849b69651 100644 (file)
@@ -560,7 +560,20 @@ void
 make_gap (ptrdiff_t nbytes_added)
 {
   if (nbytes_added >= 0)
-    make_gap_larger (nbytes_added);
+    /* With set-buffer-multibyte on a large buffer, we can end up growing the
+     * buffer *many* times.  Avoid an O(N^2) behavior by increasing by an
+     * amount at least proportional to the size of the buffer.
+     * On my test (a 223.9MB zip file on a Thinkpad T61):
+     * With /5    =>  24s
+     * With /32   =>  25s
+     * With /64   =>  26s
+     * With /128  =>  28s
+     * With /1024 =>  51s
+     * With /4096 => 131s
+     * With /∞    => gave up after 858s
+     * Of couse, ideally we should never call set-buffer-multibyte on
+     * a non-empty buffer (e.g. use buffer-swa-text instead).  */
+    make_gap_larger (max (nbytes_added, (Z - BEG) / 64));
 #if defined USE_MMAP_FOR_BUFFERS || defined REL_ALLOC || defined DOUG_LEA_MALLOC
   else
     make_gap_smaller (-nbytes_added);