3

在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

PS FizzBu​​zz?

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

4

1 回答 1

5

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

如果我可以补充一点,要进行更正确的分析,您需要重复运行这些函数一些周期。为了获得更好的结果,请执行两次并丢弃第一个结果,这将允许 Java Just-In-Time 编译器完成其工作。

于 2012-09-08T19:24:14.660 回答