Skip to content

Instantly share code, notes, and snippets.

@jkk
Created August 10, 2010 17:59
Show Gist options
  • Save jkk/517696 to your computer and use it in GitHub Desktop.
Save jkk/517696 to your computer and use it in GitHub Desktop.
;; 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