93 lines
2.9 KiB
Racket
93 lines
2.9 KiB
Racket
#lang sicp
|
|
|
|
;; Exercise 4.24: Define a procedure to run a program through an
|
|
;; interpreter and time the run.
|
|
|
|
(#%require "dd-mceval.rkt"
|
|
"analyzing-mceval.rkt"
|
|
"leval.rkt"
|
|
"timing.rkt")
|
|
|
|
(#%require (only racket/base module+))
|
|
|
|
|
|
(define (fact-program x)
|
|
`((define (fact n)
|
|
(if (= n 1) 1
|
|
(* n (fact (- n 1)))))
|
|
(fact ,x)))
|
|
|
|
(define (fib-program x)
|
|
`((define (fib n)
|
|
(cond ((= n 0) 0)
|
|
((= n 1) 1)
|
|
(else
|
|
(+ (fib (- n 2))
|
|
(fib (- n 1))))))
|
|
(fib ,x)))
|
|
|
|
(define lazy-test-program
|
|
'((define (try a b)
|
|
(if (= a 0) 1 b))
|
|
(try 0 (/ 1 0))))
|
|
|
|
(define lazy-integral-program
|
|
'((define (integral integrand initial-value dt)
|
|
(define int
|
|
(cons initial-value
|
|
(add-lists (scale-list integrand dt)
|
|
int)))
|
|
int)
|
|
|
|
(define (solve f y0 dt)
|
|
(define y (integral dy y0 dt))
|
|
(define dy (map f y))
|
|
y)
|
|
|
|
(define solution (solve (lambda (x) x) 1 0.001))
|
|
|
|
(list-ref solution 1000)))
|
|
|
|
(#%require rackunit)
|
|
|
|
(module+ test
|
|
(check-equal? (dd-eval-program (fact-program 1)) 1)
|
|
(check-equal? (analyzing-eval-program (fact-program 1)) 1)
|
|
(check-equal? (lazy-eval-program (fact-program 1)) 1)
|
|
(check-equal? (dd-eval-program (fact-program 5)) 120)
|
|
(check-equal? (analyzing-eval-program (fact-program 5)) 120)
|
|
(check-equal? (lazy-eval-program (fact-program 5)) 120)
|
|
(check-equal? (dd-eval-program (fact-program 10))
|
|
(analyzing-eval-program (fact-program 10)))
|
|
(check-equal? (dd-eval-program (fib-program 5))
|
|
(analyzing-eval-program (fib-program 5)))
|
|
(check-equal? (dd-eval-program (fib-program 5))
|
|
(lazy-eval-program (fib-program 5)))
|
|
(check-equal? (lazy-eval-program lazy-test-program) 1)
|
|
(check-= (lazy-eval-program lazy-integral-program) 2.7169 0.01)
|
|
)
|
|
|
|
(module+ timing
|
|
(define dd-fib (time-proc 100 (lambda () (dd-eval-program (fib-program 10)))))
|
|
(define analyzing-fib (time-proc 100 (lambda () (analyzing-eval-program (fib-program 10)))))
|
|
(define dd-fact (time-proc 100 (lambda () (dd-eval-program (fact-program 50)))))
|
|
(define analyzing-fact (time-proc 100 (lambda () (analyzing-eval-program (fact-program 50)))))
|
|
|
|
(display `("Fib: dd " ,dd-fib " analyzing " ,analyzing-fib " speed-up " ,(/ dd-fib analyzing-fib)))
|
|
(newline)
|
|
(display `("Fact: dd " ,dd-fact " analyzing " ,analyzing-fact " speed-up " ,(/ dd-fib analyzing-fact))))
|
|
|
|
;; Test results
|
|
;; test-eval.rkt> (time-proc 100 eval-program fib-program mce-eval mce-user-print)
|
|
;; 203/100
|
|
;; test-eval.rkt> (time-proc 100 eval-program fib-program analyzing-eval analyzing-user-print)
|
|
;; 18/25
|
|
|
|
;; test-eval.rkt> (time-proc 100 eval-program fact-program mce-eval mce-user-print)
|
|
;; 183/100
|
|
;; test-eval.rkt> (time-proc 100 eval-program fact-program analyzing-eval analyzing-user-print)
|
|
;; 89/100
|
|
|
|
;; This demonstrates the substantially better performance of the
|
|
;; analyzing evaluator.
|