Measuring latency with Criterium
Clojure has a neat little macro called time
that evaluates the body of code passed to it, and then prints out the time it took and simply returns the value. However, we can note that often the time taken to execute the code varies quite a bit across various runs:
user=> (time (reduce + (range 100000))) "Elapsed time: 112.480752 msecs" 4999950000 user=> (time (reduce + (range 1000000))) "Elapsed time: 387.974799 msecs" 499999500000
There are several reasons associated to this variance in behavior. When cold started, the JVM has its heap segments empty and is unaware of the code path. As the JVM keeps running, the heap fills up and the GC patterns start becoming noticeable. The JIT compiler gets a chance to profile the different code paths and optimize them. Only after quite some GC and JIT compilation rounds, does the JVM performance become less unpredictable.
Criterium (https://github.com/hugoduncan/criterium) is a Clojure library...