clojure の FizzBuzz に対する 2 つのソリューションのうち、最初のソリューションの方が速いのはなぜですか?
; #1
(defn fizzbuzzer [z]
"fizzbuzz checker."
(let [fizz? (zero? (rem z 3))
buzz? (zero? (rem z 5))
fizzbuzz? (and fizz? buzz?)]
(cond fizzbuzz? "FizzBuzz"
buzz? "Buzz"
fizz? "Fizz"
:else z)))
; #2
(defn fizzbuzzer2 [z]
"fizzbuzz checker."
(let [fb (str
(if (zero? (rem z 3)) "Fizz" "")
(if (zero? (rem z 5)) "Buzz" ""))]
(if (seq fb) fb z)))
; profiling ;
; (time (fizzbuzzer 1500))
; => "Elapsed time: 0.098058 msecs"
; (time (fizzbuzzer2 1500))
; => "Elapsed time: 0.150438 msecs"
;; note: profiling done on separate instances to avoid caching
Ps FizzBuzz?
~ 数が 3 で割り切れる場合は、数の代わりに Fizz を出力します。5 で割り切れる場合は、Buzz を出力します。3 と 5 の両方で割り切れる場合は、FizzBuzz を出力します。