[comp.lang.scheme] Revised Benchmark

jaffer@zurich.ai.mit.edu (Aubrey Jaffer) (05/04/91)

I have created new versions of the programs which take the number of
decimal digits in a group as the second argument.  This will allow the
user to tailor the calculation to avoid bignums.

time pi 800 4
9.3u 0.1s 0:10 94%

With 4 digits per group and (declare (usual-integrations)), compiled
MITScheme is now 2.7 times as fast as scm2d.

MITScheme
(show-time (lambda () (pi 200 4))) ==>
process time: 5960; real time: 7790

scm2d (made with -O)
(pi 200 4)
;Evaluation took 20966 mSec (1083 in gc) 242882 cons work

scm2d (made with -O -DRECKLESS)
(pi 200 4)
;Evaluation took 18666 mSec (1083 in gc) 242882 cons work

RECKLESS turns off error checking.  The type and error checking in
scm2d accounts for 12% of its runtime.

------------------------------------------------------------------------
/*  'Spigot' algorithm origionally due to Stanly Rabinowitz */
main(c,v)
int c;char **v;{
  int n=200,j,m,b=2,k,t,r=1,d=5;
  long q;
  short *a;
  if(c>1)n=atoi(v[1]);
  if(c>2)d=atoi(v[2]);
  while(k++<d)r=r*10;
  n=n/d+1;
  k=m=3.322*n*d;
  a=calloc(1+m,2);
  while(k)a[--k]=2;
  for(a[m]=4;j<n;b=q%r){
    q=0;
    for(k=m;k;){
      q+=a[k]*r;
      t=(2*k+1);
      a[k]=q%t;
      q=q/t;
      q*=k--;}
    printf("%0*d%s",d,b+q/r,++j%10?"  ":"\n");}
  puts("");}

;;; (pi n d) prints out n digits of pi in groups of d digits.
;(declare (usual-integrations))
(define (pi n d)
  (let* ((r (do ((s 1 (* 10 s))
		 (i 0 (+ 1 i)))
		((>= i d) s)))
	 (n (+ (quotient n d) 1))
	 (m (quotient (* n d 3322) 1000))
	 (a (make-vector (+ 1 m) 2)))
    (vector-set! a m 4)
    (do ((j 1 (+ 1 j))
	 (q 0 0)
	 (b 2 (remainder q r)))
	((> j n))
      (do ((k m (- k 1)))
	  ((zero? k))
	(set! q (+ q (* (vector-ref a k) r)))
	(let ((t (+ 1 (* 2 k))))
	  (vector-set! a k (remainder q t))
	  (set! q (* k (quotient q t)))))
      (let ((s (number->string (+ b (quotient q r)))))
	(do ((l (string-length s) (+ 1 l)))
	    ((>= l d) (display s))
	  (display #\0)))
      (display (if (zero? (modulo j 10)) #\newline #\ )))
    (newline)))