2012-07-04 22 views
14

Dưới đây là định nghĩa clojure của vector:Tại sao thực hiện `vector` lại có nhiều trường hợp?

(defn vector 
    "Creates a new vector containing the args." 
    {:added "1.0" 
    :static true} 
    ([] []) 
    ([a] [a]) 
    ([a b] [a b]) 
    ([a b c] [a b c]) 
    ([a b c d] [a b c d]) 
    ([a b c d & args] 
    (. clojure.lang.LazilyPersistentVector (create (cons a (cons b (cons c (cons d args)))))))) 

Tại sao có quá nhiều trường hợp? Hoặc, nếu có rất nhiều, tại sao không có nhiều hơn?

Tôi đoán là nó nổi bật về sự cân bằng giữa hiệu quả triển khai và xác suất, nhưng tôi không hoàn toàn hiểu được điều này sẽ hiệu quả hơn như thế nào.

Trả lời

22

4 dường như tạo ra sự cân bằng hiệu quả giữa khi có nhiều đối số và khi không có nhiều đối số.

Như một ví dụ:

(defn vector-few 
    ([] []) 
    ([ & args ] (. clojure.lang.LazilyPersistentVector (create args)))) 


(defn vector-many 
    ([] []) 
    ([a] [a]) 
    ([a b] [a b]) 
    ([a b c] [a b c]) 
    ([a b c d] [a b c d]) 
    ([a b c d e] [a b c d e]) 
    ([a b c d e f] [a b c d e f]) 
    ([a b c d e f & args] (. clojure.lang.LazilyPersistentVector (create (cons a (cons b (cons c (cons d (cons e (cons f args)))))))))) 

Chạy một thử nghiệm với 4 yếu tố:

=> (time (dotimes [x 1000000] (vector 1 2 3 4))) 
"Elapsed time: 12.082104 msecs" 

=> (time (dotimes [x 1000000] (vector-few 1 2 3 4))) 
"Elapsed time: 443.056339 msecs" 

=> (time (dotimes [x 1000000] (vector-many 1 2 3 4))) 
"Elapsed time: 11.812106 msecs" 

Và sau đó với 5:

=> (time (dotimes [x 1000000] (vector 1 2 3 4 5))) 
"Elapsed time: 467.904979 msecs" 

=> (time (dotimes [x 1000000] (vector-few 1 2 3 4 5))) 
"Elapsed time: 537.080198 msecs" 

=> (time (dotimes [x 1000000] (vector-many 1 2 3 4 5))) 
"Elapsed time: 10.30695 msecs" 

Và với 8 (vì vậy tất cả các chức năng đang sử dụng trường hợp var-args):

=> (time (dotimes [x 1000000] (vector 1 2 3 4 5 6 7 8))) 
"Elapsed time: 832.803266 msecs" 

=> (time (dotimes [x 1000000] (vector-few 1 2 3 4 5 6 7 8))) 
"Elapsed time: 689.526288 msecs" 

=> (time (dotimes [x 1000000] (vector-many 1 2 3 4 5 6 7 8))) 
"Elapsed time: 905.95839 msecs" 
Các vấn đề liên quan