On Sun, 2012-08-19 at 00:19 +0200, Ludovic Courtès wrote: > Hi! > > nalaginrut <nalagin...@gmail.com> skribis: > > > Our "format" is rather slow, > > What makes you say so? > > Did you make sure that the output port you’re writing to is buffered > (this is not the case by default!)? See ‘setvbuf’. >
OK, yes, I assumed the port will be buffered in default. Should I set stdin/stdout(current-input-port/current-output-port) as buffered each time? But in my case, there's only current-output-port. And I set it as buffered, the result is the same. > > can we make it faster? I can only output strings with display if I > > need an faster program, which is not so elegant. > > Until (ice-9 format) is loaded, ‘format’ is an alias for > ‘simple-format’, which is implemented in C, less capable but faster than > (ice-9 format). Perhaps that’s usable for your use case? > But I never use (ice-9 format). There's ~15s difference between "display" and "format" in my laptop. ---------------code-1------------------ (define (main . args) (let* ((ll ((@ (srfi srfi-1) iota) (read) 1)) (len (length ll)) (m (1- (/ len 2)))) (display len)(newline) (let lp((a (list-head ll (1+ m))) (b (list-tail ll (1+ m))) (n 1)) (and (< n len) (for-each (lambda (x y) (display x)(display " ")(display y)(display " ")) a b)(newline) (lp (append (list 1 (car b)) (cdr a)) (append (cdr b) (list (list-ref a m))) (1+ n)))))) -----------------end------------------- --------------code-2------------------- (define (main . args) (let* ((ll ((@ (srfi srfi-1) iota) (read) 1)) (len (length ll)) (m (1- (/ len 2)))) (display len)(newline) (let lp((a (list-head ll (1+ m))) (b (list-tail ll (1+ m))) (n 1)) (and (< n len) (for-each (lambda (x y) (format #t "~a ~a~%" x y)) a b) (lp (append (list 1 (car b)) (cdr a)) (append (cdr b) (list (list-ref a m))) (1+ n)))))) ---------------end--------------------- time { echo 6000 | ./test 1>/dev/null ;} Code-1 is 0m30.326s Code-2 is 0m45.310s PS: Please use 6000 at least, or it's size is not representative. > Thanks, > Ludo’.