generate perf analysis
[jackhill/mal.git] / impls / lib / perf.mal
1 ;; Mesure performances.
2
3 (load-file "../lib/load-file-once.mal")
4 (load-file-once "../lib/trivial.mal") ; gensym inc
5
6 ;; Evaluate an expression, but report the time spent
7 (defmacro! time
8 (fn* (exp)
9 (let* [start (gensym)
10 ret (gensym)]
11 `(let* (~start (time-ms)
12 ~ret ~exp)
13 (do
14 (println "Elapsed time:" (- (time-ms) ~start) "msecs")
15 ~ret)))))
16
17 ;; Count evaluations of a function during a given time frame.
18 (def! run-fn-for
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)
25 iters (inc last-iters)
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)))))