~ 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