~ chicken-core (chicken-5) 022dce8264fb9aead93ecc98b88ad7cc7cc79915


commit 022dce8264fb9aead93ecc98b88ad7cc7cc79915
Author:     Peter Bex <peter@more-magic.net>
AuthorDate: Tue Dec 8 21:43:16 2015 +0100
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Tue Dec 8 21:43:16 2015 +0100

    Improve irregex matching performance
    
    We add type declarations to "cset-contains?" to ensure unsafe versions
    of char comparison functions, vector access and car/cdr are used.  This
    hacks up irregex core even further, but it's worthwhile: in some cases a
    regex match can run twice as fast.
    
    Signed-off-by: Evan Hanson <evhan@foldling.org>

diff --git a/irregex-core.scm b/irregex-core.scm
index 71939af1..bae78d99 100644
--- a/irregex-core.scm
+++ b/irregex-core.scm
@@ -3718,20 +3718,24 @@
               (vector->list cset))))
 
 (define (cset-contains? cset ch)
-  (let ((len (vector-length cset)))
-    (case len
-      ((0) #f)
-      ((1) (let ((range (vector-ref cset 0)))
-             (and (char<=? ch (cdr range)) (char<=? (car range) ch))))
-      (else (let lp ((lower 0) (upper len))
-              (let* ((middle (quotient (+ upper lower) 2))
-                     (range (vector-ref cset middle)))
-                (cond ((char<? (cdr range) ch)
-                       (let ((next (+ middle 1)))
-                         (and (< next upper) (lp next upper))))
-                      ((char<? ch (car range))
-                       (and (< lower middle) (lp lower middle)))
-                      (else #t))))))))
+  ;; CHICKEN: Type assumption added for performance.  This is a very
+  ;; hot code path, so every type improvement matters.
+  (assume ((cset (vector-of (pair char char)))
+           (ch char))
+    (let ((len (vector-length cset)))
+      (case len
+        ((0) #f)
+        ((1) (let ((range (vector-ref cset 0)))
+               (and (char<=? ch (cdr range)) (char<=? (car range) ch))))
+        (else (let lp ((lower 0) (upper len))
+                (let* ((middle (quotient (+ upper lower) 2))
+                       (range (vector-ref cset middle)))
+                  (cond ((char<? (cdr range) ch)
+                         (let ((next (+ middle 1)))
+                           (and (< next upper) (lp next upper))))
+                        ((char<? ch (car range))
+                         (and (< lower middle) (lp lower middle)))
+                        (else #t)))))))))
 
 (define (char-ranges-union a b)
   (cons (if (char<=? (car a) (car b)) (car a) (car b))
Trap