这似乎很慢:
(time (doall (map + (range 1000000) (range 1000000))))
"Elapsed time: 13951.664454 msecs"
如何做得更快?
对于初学者,范围不构成数组,而是构成惰性序列。
添加两个数字集合的最快方法可能是先将它们放在数组中,然后进行迭代循环而不是映射。
user> (time (let [a (int-array (range 1000000))
b (int-array (range 1000000))]
(dotimes [i 1000000]
(aset a i (+ (aget b i) (aget a i))))
a))
"Elapsed time: 771.100395 msecs"
#<int[] [I@4233eba0>
user>
请注意,这仍然具有从两个范围调用创建和实现惰性序列的开销,在实际性能中,在进行求和步骤之前,您可能已经构建了该数据。
除非这是代码中的性能瓶颈,否则以这种方式执行操作将意味着您首先不应使用clojure。使用clojure的优点是您可以获得高级的不可变数据结构,从而导致引用透明和可并行化的代码。一旦使用了数组之类的原始jvm类型,就失去了这些优势(以换取更好的性能)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句