ada.2: typo
[jackhill/mal.git] / impls / lib / perf.mal
CommitLineData
3e9b89d4
NB
1;; Mesure performances.
2
13e679cd
NB
3(load-file "../lib/load-file-once.mal")
4(load-file-once "../lib/trivial.mal") ; gensym inc
26ced15b 5
3e9b89d4 6;; Evaluate an expression, but report the time spent
f4c8a091
JM
7(defmacro! time
8 (fn* (exp)
bf6647fb
NB
9 (let* [start (gensym)
10 ret (gensym)]
e748a37d
NB
11 `(let* (~start (time-ms)
12 ~ret ~exp)
bf6647fb 13 (do
b3f9b5a0 14 (println "Elapsed time:" (- (time-ms) ~start) "msecs")
bf6647fb 15 ~ret)))))
699f0ad2 16
3e9b89d4 17;; Count evaluations of a function during a given time frame.
699f0ad2 18(def! run-fn-for
bf6647fb
NB
19
20 (let* [
21 run-fn-for* (fn* [fn max-ms acc-ms last-iters]
22 (let* [start (time-ms)
23 _ (fn)
24 elapsed (- (time-ms) start)
26ced15b 25 iters (inc last-iters)
bf6647fb
NB
26 new-acc-ms (+ acc-ms elapsed)]
27 ;; (do (prn "new-acc-ms:" new-acc-ms "iters:" iters))
28 (if (>= new-acc-ms max-ms)
29 last-iters
30 (run-fn-for* fn max-ms new-acc-ms iters))))
31 ]
32
33 (fn* [fn max-secs]
34 ;; fn : function without parameters
35 ;; max-secs : number (seconds)
36 ;; return : number (iterations)
37 (do
38 ;; Warm it up first
39 (run-fn-for* fn 1000 0 0)
40 ;; Now do the test
41 (run-fn-for* fn (* 1000 max-secs) 0 0)))))