(defn sum-of-range-1 [range-limit]
  (reduce + (range 1 range-limit)))

(defn sum-of-range-2 [range-limit]
  (apply + (range 1 range-limit)))

(defn sum-of-range-3 [#^long range-limit]
  (reduce + (range 1 range-limit)))

(defn sum-of-range-4 [range-limit]
  (loop [i (int 1) s (long 0)]
    (if (< i range-limit)
      (recur (inc i) (+ s i))
      s)))

(defmacro ntimes [n form]
  `(do ~@(for [i (range n)]
           form)))

(defn timings []
  (with-out-str 
    (doall (for [f [sum-of-range-1 
                    sum-of-range-2 
                    sum-of-range-3 
                    sum-of-range-4]]
             (do (println f)
                 (time (ntimes 1000 (f 1000000))))))))


(println (timings))