在clojure的FizzBuzz的两个解决方案中,为什么第一个更快?
; #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。 FizzBuzz?
〜如果数字可被3整除,则打印Fizz而不是数字。如果它可被5整除,则打印Buzz。如果它可以被3和5整除,请打印FizzBuzz。
答案 0 :(得分:5)
当第一个请求返回对现有字符串的引用时,第二个解决方案会为每个请求连接字符串。 (str(if ..)(if ..))创建2个中间字符串。
如果我可以添加,为了进行更合适的分析,您需要重复运行这些函数一段时间。为了获得更好的结果,请执行两次并丢弃第一个结果,这将允许Java Just-In-Time编译器完成其工作。