bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#12796: Optimize `ido-completing-read' for larger lists with flex mat


From: Dmitry Gutov
Subject: bug#12796: Optimize `ido-completing-read' for larger lists with flex matching enabled
Date: Thu, 08 Nov 2012 08:29:19 +0400
User-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20121026 Thunderbird/16.0.2

On 08.11.2012 6:05, Stefan Monnier wrote:
-      (setq re (mapconcat #'regexp-quote (split-string ido-text "") ".*"))
+      (setq re (mapconcat #'regexp-quote (split-string ido-text "" t)
".*"))

Sounds like a good change.  Tho:

    (mapconcat (lambda (c) (regexp-quote (string c))) ido-text ".*")

would work as well.

Indeed. A two-character change offering massive speedup looks cuter, though. And easier to understand for casual readers.

You could try to speed up the regexp matching some more by eliminating
backtracking (which should mostly eliminate a few pathological cases):

    (let ((first t))
      (mapconcat (lambda (c)
                   (if first
                       (progn (setq first nil) (regexp-quote (string c)))
                     (concat "[^" (string c) "]*"
                             (regexp-quote (string c)))))
                 ido-text ""))

Yep, this adds some further speedup especially with longer string.
To use the existing testing setup (numbers are a bit different in this session):

;; omt 18000 15 abcdefghzzzzz 0.042
;; nbt 18000 15 abcdefghzzzzz 0.040

;; omt 18000 45 abcdefghzzz123 0.127
;; nbt 18000 45 abcdefghzzz123 0.087

I'm still going to see if I can make while-no-input work here, though.

Yes, that'd be very welcome.

I sent a patch that doesn't seem to break anything for me:

http://debbugs.gnu.org/cgi/bugreport.cgi?bug=12796#41

But in the light of the above numbers, it seems that (while-no-input) would almost always guard a section of code that takes 1/20th of a second to run, or less. Only useful when a user has floored "backspace", I think.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]