为什么“vector”实现有多种情况?

为什么“vector”实现有多种情况?,vector,clojure,language-implementation,Vector,Clojure,Language Implementation,以下是clojure对以下内容的定义: 为什么会有这么多案例?或者,如果有这么多,为什么没有更多 我的猜测是,它在实现效率和概率之间取得了平衡,但我不太明白这将如何提高效率。4似乎在有很多争论和没有很多争论之间取得了效率的平衡 例如: (defn vector-few ([] []) ([ & args ] (. clojure.lang.LazilyPersistentVector (create args)))) (defn vector-many ([] [])

以下是clojure对以下内容的定义:

为什么会有这么多案例?或者,如果有这么多,为什么没有更多


我的猜测是,它在实现效率和概率之间取得了平衡,但我不太明白这将如何提高效率。

4似乎在有很多争论和没有很多争论之间取得了效率的平衡

例如:

(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))))))))))
使用4个元素运行测试:

=> (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"
然后用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"
对于8(因此所有函数都使用var args案例):

=> (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"
=> (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"