[r6rs-discuss] [Formal] Requirement to detect circular lists -
benchmarks
AndrevanTonder
andre at het.brown.edu
Thu Oct 5 00:08:38 EDT 2006
On Wed, 4 Oct 2006, Shiro Kawai wrote:
> I used to think one advantage of current requirement
> was that 'map' and alike could check argument vailidity along
> applying the passed procedure on elements, so it could avoid
> two-pass check cost, but Mr. Clinger has explained it's not the case.
To have some point of comparison, I have done just two simple
non-represntative benchmarks comparing r5rs and r6rs versions of map (1-arg).
The r6rs version does the circularity check up front (implementations that do
the check concurrently will presumably take longer on a single processor given
the additional thread overhead). The listing with the specific tests is at the end.
All was done best of 5 with default compiler options on Pentium 4.
r5rs map r6rs map %
-------- -------- -
Larceny 703 953 136%
Petite (interpr) 3078 6766 220%
These are the best results. On Larceny some of the individual results
were the other way around. I would be curious to know what the Chez compiler
does with this.
Cheers
Andre
(define (list-circ? clist)
(define (test hare tortoise)
(or (null? hare)
(and (pair? hare)
(let ((hare (cdr hare)))
(or (null? hare)
(and (pair? hare)
(not (eq? hare tortoise))
(test (cdr hare) (cdr tortoise))))))))
(test clist clist))
(define (map-circ f clist)
(define (map-1 list)
(if (null? list)
'()
(cons (f (car list))
(map-1 (cdr list)))))
(or (list-circ? clist)
(error "Not a list"))
(map-1 clist))
(define (map-reg f list)
(define (map-1 list)
(cond ((null? list) '())
((pair? list)
(cons (f (car list))
(map-1 (cdr list))))
(else (error "Not a list"))))
(map-1 list))
(define (create n)
(if (= n 0)
'()
(cons (list #t) (create (- n 1)))))
(define (test m ls fun)
(define (test-one p)
(let f ((m m))
(if (not (= m 0))
(begin (p car ls)
(f (- m 1))))))
(test-one fun))
;; do create outide anyway
(define l1 (create 1000000))
(define l2 (create 10000))
(define l3 (create 100))
(define l4 (create 1))
(define (test* f)
(test 1 l1 f)
(test 100 l2 f)
(test 10000 l3 f)
(test 1000000 l4 f)
#t)
(time (test* map-reg))
(time (test* map-circ))
More information about the r6rs-discuss
mailing list