Testing Functionsλ︎
Adding the Criterium libraryλ︎
Add [criterium "0.4.4"] to you project.clj file.
Add criterium to the namespace were you run your tests
Or simply require criterium in the REPL
Using Criterium to test codeλ︎
Lets try a few similar Clojure functions to see the Criterium benchmark in action
Benchmark output is sent to the REPL
Evaluation count : 50788488 in 6 samples of 8464748 calls.
Execution time mean : 2.535916 ns
Execution time std-deviation : 0.096838 ns
Execution time lower quantile : 2.435814 ns ( 2.5%)
Execution time upper quantile : 2.686146 ns (97.5%)
Overhead used : 9.431514 ns
Found 1 outliers in 6 samples (16.6667 %)
low-severe 1 (16.6667 %)
Variance from outliers : 13.8889 % Variance is moderately inflated by outliers
Running the benchmark again for the same expression, we get pretty consistent results
Evaluation count : 50408712 in 6 samples of 8401452 calls.
Execution time mean : 2.571379 ns
Execution time std-deviation : 0.163071 ns
Execution time lower quantile : 2.366952 ns ( 2.5%)
Execution time upper quantile : 2.721099 ns (97.5%)
Overhead used : 9.431514 ns
There is a parallized version of cond called condp.
Evaluation count : 3625284 in 6 samples of 604214 calls.
Execution time mean : 156.813816 ns
Execution time std-deviation : 2.560629 ns
Execution time lower quantile : 154.222522 ns ( 2.5%)
Execution time upper quantile : 160.425030 ns (97.5%)
Overhead used : 9.431514 ns
Found 1 outliers in 6 samples (16.6667 %)
low-severe 1 (16.6667 %)
Variance from outliers : 13.8889 % Variance is moderately inflated by outliers
That figure is quite high, lets run that again.
Evaluation count : 3707922 in 6 samples of 617987 calls.
Execution time mean : 154.219102 ns
Execution time std-deviation : 3.427811 ns
Execution time lower quantile : 149.777377 ns ( 2.5%)
Execution time upper quantile : 159.225180 ns (97.5%)
Overhead used : 9.431514 ns
So using a parallized version of a function adds a significant exectution time. I believe the extra time is due to setting up a thread. If so, then when using condp you only get a more effective throughput when running multiple parallel threads, which should be fairly obvious.
Now lets benchmark a similar function called case. This function is nicely optimised on the JVM especially when the values are sequential, so we should see faster results
Benchmark output is sent to the REPL
Evaluation count : 56533626 in 6 samples of 9422271 calls.
Execution time mean : 1.158650 ns
Execution time std-deviation : 0.187322 ns
Execution time lower quantile : 1.021431 ns ( 2.5%)
Execution time upper quantile : 1.471115 ns (97.5%)
Overhead used : 9.431514 ns
Found 1 outliers in 6 samples (16.6667 %)
low-severe 1 (16.6667 %)
Variance from outliers : 47.5092 % Variance is moderately inflated by outliers