Задача - создать массив случайных чисел на 3000000 элементов и замерить сколько времени займет нахождение суммы квадратов.
SBCL:
(defconstant +size+ 3000000)
(defparameter *vector* (map-into (make-array +size+ :element-type 'double-float) (lambda () (random 1.0d0))))
(defun sum-vec (v &aux (s 0.0d0))
(declare (optimize speed (safety 0) (debug 0))
(type (simple-array double-float (*)) v)
(type double-float s))
(dotimes (i (length v) s)
(incf s (expt (elt v i) 2))))
(time (sum-vec *vector*))
$ sbcl --load bench.lisp
Evaluation took:
0.009 seconds of real time
0.012001 seconds of total run time (0.012001 user, 0.000000 system)
Racket
#lang typed/racket
(require racket/flonum)
(define Sz 3000000)
(define test-vec
(for/flvector #:length Sz ([i (in-range Sz)]) (random)))
(: sum-vec : FlVector -> Flonum)
(define (sum-vec v)
(for/fold ([S 0.0]) ([e (in-flvector v)])
(fl+ (fl* e e) S)))
(time (sum-vec test-vec))
$ raco exe bench.rkt
$ ./bench
cpu time: 20 real time: 22 gc time: 0
1. Можно ли код на racket еще улучшить?
2. Сколько времени занимает обработка в ваших языках? Особенно интересует ocaml и haskell
UPD. Думаю стоит пририсовать два нуля к размеру массивов, чтобы они не влезали целиком в кеши, олсо подумать там более произвольным доступом в к элементам.