Mat*_*ick 14 language-implementation vector clojure
这是clojure的定义vector:
(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))))))))
Run Code Online (Sandbox Code Playgroud)
为什么会有这么多案件?或者,如果有这么多,为什么还有更多呢?
我的猜测是它在实现效率和概率之间达到了平衡,但我不太清楚这是如何更有效的.
huo*_*uon 22
当有很多争论和争论不多时,似乎在效率之间取得平衡.
举个例子:
(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))))))))))
Run Code Online (Sandbox Code Playgroud)
运行包含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"
Run Code Online (Sandbox Code Playgroud)
然后用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"
Run Code Online (Sandbox Code Playgroud)
并且使用8(因此所有函数都使用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"
Run Code Online (Sandbox Code Playgroud)