Skip to content

Instantly share code, notes, and snippets.

@cgrand
Created February 22, 2013 17:05
Show Gist options
  • Save cgrand/5014959 to your computer and use it in GitHub Desktop.
Save cgrand/5014959 to your computer and use it in GitHub Desktop.
I ♥ associativity! comp is associative and optimized up to arity 3, let's leverage it! (I ♥ commutativity more, though)
(defn- balance [n f & args]
(if (> (count args) n)
(apply balance n f (map #(apply f %) (partition-all n args)))
(apply f args)))
;; optimization kicks in for N >= 4
=> (doseq [N (range 1 16)]
(let [++ (apply comp (repeat N inc))
b++ (apply balance 3 comp (repeat N inc))]
(println "N=" N)
(time (dotimes [n (/ 1e7 N)] (++ n)))
(time (dotimes [n (/ 1e7 N)] (b++ n)))))
N= 1
"Elapsed time: 314.49 msecs"
"Elapsed time: 283.901 msecs"
N= 2
"Elapsed time: 523.819 msecs"
"Elapsed time: 510.677 msecs"
N= 3
"Elapsed time: 389.977 msecs"
"Elapsed time: 408.597 msecs"
N= 4
"Elapsed time: 1537.677 msecs"
"Elapsed time: 492.707 msecs"
N= 5
"Elapsed time: 1225.063 msecs"
"Elapsed time: 503.592 msecs"
N= 6
"Elapsed time: 1245.603 msecs"
"Elapsed time: 492.784 msecs"
N= 7
"Elapsed time: 1087.398 msecs"
"Elapsed time: 370.495 msecs"
N= 8
"Elapsed time: 1295.758 msecs"
"Elapsed time: 434.075 msecs"
N= 9
"Elapsed time: 1084.12 msecs"
"Elapsed time: 334.002 msecs"
N= 10
"Elapsed time: 979.564 msecs"
"Elapsed time: 424.21 msecs"
N= 11
"Elapsed time: 965.945 msecs"
"Elapsed time: 346.99 msecs"
N= 12
"Elapsed time: 1100.682 msecs"
"Elapsed time: 347.335 msecs"
N= 13
"Elapsed time: 933.35 msecs"
"Elapsed time: 353.287 msecs"
N= 14
"Elapsed time: 897.669 msecs"
"Elapsed time: 366.5 msecs"
N= 15
"Elapsed time: 866.187 msecs"
"Elapsed time: 373.318 msecs"
nil
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment