[Cl-darcs-cvs] r88 - cl-darcs/trunk

Author: mhenoch Date: Wed Feb 14 23:00:30 2007 New Revision: 88 Modified: cl-darcs/trunk/util.lisp Log: Combine regexps into one to reduce memory use. Modified: cl-darcs/trunk/util.lisp ============================================================================== --- cl-darcs/trunk/util.lisp (original) +++ cl-darcs/trunk/util.lisp Wed Feb 14 23:00:30 2007 @@ -287,13 +287,23 @@ (defun matches-one-of (regexps string) "Return true if some of REGEXPS match STRING. Cache scanners for faster execution beyond first time." - (dolist (regexp regexps) - (let ((scanner (or - (gethash regexp *scanner-cache*) - (setf (gethash regexp *scanner-cache*) - (cl-ppcre:create-scanner regexp))))) - (when (cl-ppcre:scan scanner string) - (return t))))) + ;; These scanners use _a lot_ of memory, so we build just one, and + ;; hope that the exact combination of regexps will be used often + ;; enough. + (setq regexps (sort (copy-seq regexps) #'string>)) + (let* ((combined-regexp + (apply + #'concatenate 'string + (loop for regexp in regexps + for n upfrom 0 + unless (zerop n) collect "|" + collect regexp))) + (scanner (or + (gethash combined-regexp *scanner-cache*) + (setf (gethash combined-regexp *scanner-cache*) + (cl-ppcre:create-scanner combined-regexp))))) + (when (cl-ppcre:scan scanner string) + t))) (defun file-binary-p (repo filename) "Return true if FILENAME names a binary file.
participants (1)
-
mhenoch@common-lisp.net