2012-09-08 76 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

相關問題