From 72ec18cc68086d02607dc9c132c2e8e31b0232da Mon Sep 17 00:00:00 2001 From: Vincent St-Amour Date: Mon, 14 Jun 2010 13:10:19 -0400 Subject: [PATCH] Rewrote the moments benchmark to potentially benefit from unboxing of loop accumulators. --- .../racket/benchmarks/shootout/moments.rkt | 104 ++++++++-------- .../benchmarks/shootout/typed/moments.rktl | 111 ++++++++---------- 2 files changed, 98 insertions(+), 117 deletions(-) diff --git a/collects/tests/racket/benchmarks/shootout/moments.rkt b/collects/tests/racket/benchmarks/shootout/moments.rkt index 7044cc342e..63779c0c34 100644 --- a/collects/tests/racket/benchmarks/shootout/moments.rkt +++ b/collects/tests/racket/benchmarks/shootout/moments.rkt @@ -8,62 +8,52 @@ (define (to-str n) (real->decimal-string n 6)) -(let* ((sum 0.0) - (numlist (let loop ((line (read-line)) (numlist '())) - (cond ((eof-object? line) numlist) - (else - (let ((num (string->number line))) - (set! sum (+ num sum)) - (loop (read-line) (cons num numlist)))))))) - (unless (null? numlist) - (let ((n (length numlist))) - (let ((mean (/ sum n)) - (average_deviation 0.0) - (standard_deviation 0.0) - (variance 0.0) - (skew 0.0) - (kurtosis 0.0) - (median 0.0) - (deviation 0.0)) - (let loop ((nums numlist)) - (if (not (null? nums)) - (begin - (set! deviation (- (car nums) mean)) - (set! average_deviation (+ average_deviation (abs deviation))) - (set! variance (+ variance (expt deviation 2))) - (set! skew (+ skew (expt deviation 3))) - (set! kurtosis (+ kurtosis (expt deviation 4))) - (loop (cdr nums))) - #t)) +(let loop ((line (read-line)) (numlist '()) (sum 0.0)) + (cond ((not (eof-object? line)) + (let ((num (string->number line))) + (loop (read-line) (cons num numlist) (+ num sum)))) + (else + (unless (null? numlist) + (let* ((n (length numlist)) + (mean (/ sum n))) + (let loop ((nums numlist) + (average_deviation 0.0) + (variance 0.0) + (skew 0.0) + (kurtosis 0.0) + (deviation 0.0)) + (if (not (null? nums)) + (loop (cdr nums) + (+ average_deviation (abs deviation)) + (+ variance (expt deviation 2)) + (+ skew (expt deviation 3)) + (+ kurtosis (expt deviation 4)) + (- (car nums) mean)) + (let* ((average_deviation (/ average_deviation (exact->inexact n))) + (variance (/ variance (- n 1))) + (standard_deviation (flsqrt variance)) + (numlist (sort numlist (lambda (x y) (< x y))))) - (set! average_deviation (/ average_deviation (exact->inexact n))) - (set! variance (/ variance (- n 1))) - (set! standard_deviation (flsqrt variance)) + (cond ((> variance 0.0) + (set! skew (/ skew (* n variance standard_deviation))) + (set! kurtosis (- (/ kurtosis (* n variance variance)) + 3.0)))) - (cond ((> variance 0.0) - (set! skew (/ skew (* n variance standard_deviation))) - (set! kurtosis (- (/ kurtosis (* n variance variance)) - 3.0)))) - - (set! numlist (sort numlist (lambda (x y) (< x y)))) - - (let ((mid (quotient n 2))) - (if (zero? (modulo n 2)) - (set! median (/ (+ (car (list-tail numlist mid)) - (car (list-tail numlist (- mid 1)))) - 2.0)) - (set! median (car (list-tail numlist mid))))) - - - (set! standard_deviation (/ (round (* standard_deviation 1000000)) - 1000000)) - - (for-each display - `("n: " ,n "\n" - "median: " ,(to-str median) "\n" - "mean: " ,(to-str mean) "\n" - "average_deviation: " ,(to-str average_deviation ) "\n" - "standard_deviation: " ,(to-str standard_deviation) "\n" - "variance: " ,(to-str variance)"\n" - "skew: " ,(to-str skew) "\n" - "kurtosis: " ,(to-str kurtosis)"\n" )))))) + (let* ((mid (quotient n 2)) + (median (if (zero? (modulo n 2)) + (/ (+ (car (list-tail numlist mid)) + (car (list-tail numlist (- mid 1)))) + 2.0) + (car (list-tail numlist mid)))) + (standard_deviation (/ (round (* standard_deviation 1000000)) + 1000000))) + + (for-each display + `("n: " ,n "\n" + "median: " ,(to-str median) "\n" + "mean: " ,(to-str mean) "\n" + "average_deviation: " ,(to-str average_deviation ) "\n" + "standard_deviation: " ,(to-str standard_deviation) "\n" + "variance: " ,(to-str variance)"\n" + "skew: " ,(to-str skew) "\n" + "kurtosis: " ,(to-str kurtosis)"\n" ))))))))))) diff --git a/collects/tests/racket/benchmarks/shootout/typed/moments.rktl b/collects/tests/racket/benchmarks/shootout/typed/moments.rktl index fc393373b3..6cadefe2ab 100644 --- a/collects/tests/racket/benchmarks/shootout/typed/moments.rktl +++ b/collects/tests/racket/benchmarks/shootout/typed/moments.rktl @@ -7,66 +7,57 @@ (: to-str (Number -> String)) (define (to-str n) (real->decimal-string n 6)) -(let*: ((sum : Float 0.0) - (numlist : (Listof Float) - (let: loop : (Listof Float) - ((line : String (read-line)) - (numlist : (Listof Float) '())) - (cond ((eof-object? line) numlist) - (else - (let ((num (exact->inexact (assert (string->number line) real?)))) - (set! sum (+ num sum)) - (loop (read-line) (cons num numlist)))))))) - (unless (null? numlist) - (let ((n (length numlist))) - (let: ((mean : Float (/ sum (exact->inexact n))) - (average_deviation : Float 0.0) - (standard_deviation : Float 0.0) - (variance : Float 0.0) - (skew : Float 0.0) - (kurtosis : Float 0.0) - (median : Float 0.0) - (deviation : Float 0.0)) - (let loop ((nums numlist)) - (if (not (null? nums)) - (begin - (set! deviation (- (car nums) mean)) - (set! average_deviation (+ average_deviation (abs deviation))) - (set! variance (+ variance (expt deviation 2))) - (set! skew (+ skew (expt deviation 3))) - (set! kurtosis (+ kurtosis (expt deviation 4))) - (loop (cdr nums))) - #t)) +(let: loop : Void + ((line : (U String EOF) (read-line)) + (numlist : (Listof Float) '()) + (sum : Float 0.0)) + (cond ((not (eof-object? line)) + (let ((num (exact->inexact (assert (string->number line) real?)))) + (loop (read-line) (cons num numlist) (+ num sum)))) + (else + (unless (null? numlist) + (let* ((n (length numlist)) + (mean (/ sum (exact->inexact n)))) + (let: loop : Void + ((nums : (Listof Float) numlist) + (average_deviation : Float 0.0) + (variance : Float 0.0) + (skew : Float 0.0) + (kurtosis : Float 0.0) + (deviation : Float 0.0)) + (if (not (null? nums)) + (loop (cdr nums) + (+ average_deviation (abs deviation)) + (+ variance (expt deviation 2)) + (+ skew (expt deviation 3)) + (+ kurtosis (expt deviation 4)) + (- (car nums) mean)) + (let* ((average_deviation (/ average_deviation (exact->inexact n))) + (variance (/ variance (- n 1.0))) + (standard_deviation (flsqrt variance)) + (numlist ((inst sort Float Float) numlist (lambda: ((x : Float) (y : Float)) + (< x y))))) - (set! average_deviation (/ average_deviation (exact->inexact n))) - (set! variance (/ variance (- n 1))) - (set! standard_deviation (flsqrt variance)) + (cond ((> variance 0.0) + (set! skew (exact->inexact (/ skew (* n variance standard_deviation)))) + (set! kurtosis (- (/ kurtosis (* n variance variance)) + 3.0)))) - (cond ((> variance 0.0) - (set! skew (exact->inexact (/ skew (* n variance standard_deviation)))) - (set! kurtosis (- (/ kurtosis (* n variance variance)) - 3.0)))) + (let* ((mid (quotient n 2)) + (median (if (zero? (modulo n 2)) + (/ (+ (car (list-tail numlist mid)) + (car (list-tail numlist (assert (- mid 1) exact-nonnegative-integer?)))) + 2.0) + (car (list-tail numlist mid)))) + (standard_deviation (exact->inexact (/ (round (* standard_deviation 1000000)) + 1000000)))) - (set! numlist ((inst sort Float Float) numlist (lambda: ((x : Float) (y : Float)) - (< x y)))) - - (let ((mid (quotient n 2))) - (if (zero? (modulo n 2)) - (set! median (/ (+ (car (list-tail numlist mid)) - (car (list-tail numlist (assert (- mid 1) exact-nonnegative-integer?)))) - 2.0)) - (set! median (car (list-tail numlist mid))))) - - - (set! standard_deviation (exact->inexact (/ (round (* standard_deviation 1000000)) - 1000000))) - - (for-each display - `("n: " ,n "\n" - "median: " ,(to-str median) "\n" - "mean: " ,(to-str mean) "\n" - "average_deviation: " ,(to-str average_deviation ) "\n" - "standard_deviation: " ,(to-str standard_deviation) "\n" - "variance: " ,(to-str variance)"\n" - "skew: " ,(to-str skew) "\n" - "kurtosis: " ,(to-str kurtosis)"\n" )))))) + (for-each display + `("n: " ,n "\n" + "median: " ,(to-str median) "\n" + "mean: " ,(to-str mean) "\n" + "average_deviation: " ,(to-str average_deviation ) "\n" + "standard_deviation: " ,(to-str standard_deviation) "\n" + "variance: " ,(to-str variance)"\n" + "skew: " ,(to-str skew) "\n" + "kurtosis: " ,(to-str kurtosis)"\n" )))))))))))