A single loop/recur in Clojure executes as fast as it's Java for loop equivalent
Clojure Version:
(defn singel-loop [i-count]
(loop [i 0]
(if (= i i-count)
i
(recur (inc i)))))
(time (loop-test 100101))
"Elapsed time: 0.8857 msecs"
Java Version:
long s = System.currentTimeMillis();
for (i = 0; i < 100000; i++) {
}
System.out.println("Time: " + (System.currentTimeMillis() - s));
Time: ~1ms
However, if you add an inner loop/recur
the performance absolutely falls off of a cliff!
Clojure:
(defn double-loop [i-count j-count]
(loop [i 0]
(loop [j 0]
(if (= j j-count)
j
(recur (inc j))))
(if (= i i-count)
i
(recur (inc i)))))
(time (double-loop 100000 100000))
"Elapsed time: 70673.9189 msecs"
Java Version:
long s = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
for (int j = 0; j < 100000; j++) {
}
}
System.out.println((System.currentTimeMillis() - s));
Time: ~3ms
Why does the performance of the Clojure version tank to a comical degree whereas the Java version stays constant?