Merge pull request #406 from chr15m/lib-alias-hacks
[jackhill/mal.git] / lib / perf.mal
1 ;; Mesure performances.
2
3 ;; Evaluate an expression, but report the time spent
4 (defmacro! time
5 (fn* (exp)
6 (let* [start (gensym)
7 ret (gensym)]
8 `(let* [~start (time-ms)
9 ~ret ~exp]
10 (do
11 (prn (str "Elapsed time: " (- (time-ms) ~start) " msecs"))
12 ~ret)))))
13
14 ;; Count evaluations of a function during a given time frame.
15 (def! run-fn-for
16
17 (let* [
18 run-fn-for* (fn* [fn max-ms acc-ms last-iters]
19 (let* [start (time-ms)
20 _ (fn)
21 elapsed (- (time-ms) start)
22 iters (+ 1 last-iters)
23 new-acc-ms (+ acc-ms elapsed)]
24 ;; (do (prn "new-acc-ms:" new-acc-ms "iters:" iters))
25 (if (>= new-acc-ms max-ms)
26 last-iters
27 (run-fn-for* fn max-ms new-acc-ms iters))))
28 ]
29
30 (fn* [fn max-secs]
31 ;; fn : function without parameters
32 ;; max-secs : number (seconds)
33 ;; return : number (iterations)
34 (do
35 ;; Warm it up first
36 (run-fn-for* fn 1000 0 0)
37 ;; Now do the test
38 (run-fn-for* fn (* 1000 max-secs) 0 0)))))
39
40 nil