2012-09-08 28 views
3

在clojure的FizzBu​​zz的两个解决方案中,为什么第一个更快?在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. FizzBu​​zz?

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

+0

为什么它更快? –

回答

5

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

如果我可以添加,做一个更合适的分析,你需要重复运行这些函数的一些循环。为了获得更好的结果,请执行两次并放弃第一个结果,这将允许Java即时编译器执行其工作。

+2

或查看[Criterium](https://github.com/hugoduncan/criterium) – noahlz

相关问题