Created
August 10, 2010 17:59
-
-
Save jkk/517696 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; Re: http://twoguysarguing.wordpress.com/2010/08/09/sum-to-a-million/ | |
;; Note: (n*(n+1))/2 is obviously faster | |
(defn triangle-num [s e] | |
(let [n (long e)] | |
(loop [sum (long 0) | |
i (long s)] | |
(if (> i n) | |
sum | |
(recur (unchecked-add sum i) | |
(unchecked-inc i)))))) | |
(defn par-triangle-num [n] | |
(let [batches (+ 2 (.availableProcessors (Runtime/getRuntime))) | |
batch-size (/ n batches) | |
futures (doall | |
(for [i (range batches)] | |
(future (triangle-num (inc (* i batch-size)) | |
(* (inc i) batch-size)))))] | |
(reduce + (map deref futures)))) | |
(comment | |
;; 1,000,000 | |
(dotimes [_ 10] (time (triangle-num 1 1000000))) | |
"Elapsed time: 0.931 msecs" | |
"Elapsed time: 0.963 msecs" | |
"Elapsed time: 0.941 msecs" | |
"Elapsed time: 0.957 msecs" | |
"Elapsed time: 0.857 msecs" | |
"Elapsed time: 0.861 msecs" | |
"Elapsed time: 0.988 msecs" | |
"Elapsed time: 0.828 msecs" | |
"Elapsed time: 0.895 msecs" | |
"Elapsed time: 0.869 msecs" | |
nil | |
(dotimes [_ 10] (time (par-triangle-num 1000000))) | |
"Elapsed time: 0.842 msecs" | |
"Elapsed time: 0.857 msecs" | |
"Elapsed time: 0.913 msecs" | |
"Elapsed time: 0.814 msecs" | |
"Elapsed time: 0.834 msecs" | |
"Elapsed time: 0.726 msecs" | |
"Elapsed time: 0.62 msecs" | |
"Elapsed time: 0.61 msecs" | |
"Elapsed time: 0.853 msecs" | |
"Elapsed time: 0.879 msecs" | |
nil | |
;; 100,000,000 | |
(dotimes [_ 10] (time (triangle-num 1 100000000))) | |
"Elapsed time: 86.021 msecs" | |
"Elapsed time: 74.434 msecs" | |
"Elapsed time: 79.351 msecs" | |
"Elapsed time: 85.847 msecs" | |
"Elapsed time: 75.201 msecs" | |
"Elapsed time: 87.021 msecs" | |
"Elapsed time: 78.764 msecs" | |
"Elapsed time: 90.479 msecs" | |
"Elapsed time: 83.884 msecs" | |
"Elapsed time: 87.911 msecs" | |
nil | |
user> (dotimes [_ 10] (time (par-triangle-num 100000000))) | |
"Elapsed time: 45.023 msecs" | |
"Elapsed time: 46.927 msecs" | |
"Elapsed time: 44.417 msecs" | |
"Elapsed time: 49.23 msecs" | |
"Elapsed time: 44.339 msecs" | |
"Elapsed time: 46.003 msecs" | |
"Elapsed time: 45.256 msecs" | |
"Elapsed time: 45.341 msecs" | |
"Elapsed time: 45.255 msecs" | |
"Elapsed time: 46.893 msecs" | |
nil | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment