在clojure的FizzBu​​zz的两个解决方案中,为什么一个更快?

时间:2012-09-08 18:59:09

标签: clojure profiling fizzbuzz

在clojure的FizzBu​​zz的两个解决方案中,为什么第一个更快?

; #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

P.S。 FizzBu​​zz?

〜如果数字可被3整除,则打印Fizz而不是数字。如果它可被5整除,则打印Buzz。如果它可以被3和5整除,请打印FizzBu​​zz。

1 个答案:

答案 0 :(得分:5)

当第一个请求返回对现有字符串的引用时,第二个解决方案会为每个请求连接字符串。 (str(if ..)(if ..))创建2个中间字符串。

如果我可以添加,为了进行更合适的分析,您需要重复运行这些函数一段时间。为了获得更好的结果,请执行两次并丢弃第一个结果,这将允许Java Just-In-Time编译器完成其工作。