[gambit-list] Speed on XML-parsing

Hans Petter Egesund petter.egesund at gmail.com
Sat Aug 16 11:51:44 EDT 2008


Hi, it might have been a to optimistic approach, but I did just copy  
the new macros into ssax (on the top of the file SSAX-code.scm which  
seems to do the job).

It still compiles, but now I get a segmentation fault, when running,

As far as I can see this is not due to a thread-problem - ssax does  
not use many thread, nor do I.

It probably needs more investigation. Any opinions about where to  
start looking?

Petter


Den 16. aug. 2008 kl. 16.09 skrev Marc Feeley:

> If you are really into optimizing the I/O, I suggest you implement  
> your own special purpose string-port I/O layer.  Basically you  
> redefine read-char to read from a string.  The code below shows  
> that this can be over 20 times faster than Gambit's built-in string  
> ports.  The main reasons for the difference are function inlining  
> and locking (to support multithreading).
>
> (define (convoluted-string-length1 str) ;; uses standard string ports
>   (declare (standard-bindings) (fixnum) (not safe))
>   (let ((port (open-input-string str)))
>     (let loop ((i 0))
>       (let ((c (read-char port)))
>         (if (char? c)
>             (loop (+ i 1))
>             i)))))
>
> (define-macro (macro-open-input-string str)
>   `(let ((str ,str))
>      (declare (standard-bindings) (fixnum) (not safe))
>      (cons str 0)))
>
> (define-macro (macro-read-char my-port)
>   `(let ((my-port ,my-port))
>      (declare (standard-bindings) (fixnum) (not safe))
>      (let ((str (car my-port))
>            (pos (cdr my-port)))
>        (if (< pos (string-length str))
>            (let ((c (string-ref str pos)))
>              (set-cdr! my-port (+ 1 pos))
>              c)
>            #!eof))))
>
> (define-macro (open-input-string str) `(macro-open-input-string ,str))
> (define-macro (read-char port) `(macro-read-char ,port))
>
> ;; insert your code after this point, for example:
>
> (define (convoluted-string-length2 str) ;; uses "fast" string ports
>   (declare (standard-bindings) (fixnum) (not safe))
>   (let ((port (open-input-string str)))
>     (let loop ((i 0))
>       (let ((c (read-char port)))
>         (if (char? c)
>             (loop (+ i 1))
>             i)))))
>
> (define (test)
>   (let ((s (make-string 4000000 #\!)))
>     (pretty-print (time (convoluted-string-length1 s)))
>     (pretty-print (time (convoluted-string-length2 s)))))
>
> (test)
>
> ;; (time (convoluted-string-length1 s))
> ;;     704 ms real time
> ;;     703 ms cpu time (661 user, 42 system)
> ;;     1 collection accounting for 50 ms real time (32 user, 19  
> system)
> ;;     36023288 bytes allocated
> ;;     no minor faults
> ;;     no major faults
> ;; 4000000
> ;; (time (convoluted-string-length2 s))
> ;;     26 ms real time
> ;;     25 ms cpu time (25 user, 0 system)
> ;;     no collections
> ;;     24 bytes allocated
> ;;     no minor faults
> ;;     no major faults
> ;; 4000000
>




More information about the Gambit-list mailing list