clojure subvec O(n)而不是O(1)?

Lov*_*ing 2 clojure

所以我有

(def a (vec (range 1000000)))
(def b (vec (range 100000)))
Run Code Online (Sandbox Code Playgroud)

并采取两个向量的其余部分

(time (dorun (subvec b 1 100000)))
=>"Elapsed time: 3.585556 msecs"
(time (dorun (subvec a 1 1000000)))
=>"Elapsed time: 43.088316 msecs"
Run Code Online (Sandbox Code Playgroud)

医生说这个操作需要O(1).我错过了什么吗?

Mic*_*zyk 6

该时间用于dorun遍历整个矢量切片.

顺便说一下,矢量并不是懒惰的; 将它们包裹在dorun/中doall是没有意义的.

  • 你真的应该使用适当的基准测试库; [Criterium](https://github.com/hugoduncan/criterium)是标准的Clojure解决方案.(`(要求'[criterium.core:as c])`,然后`(c/bench(subvec b 1))`.)在JIT编译器存在的情况下获得基准测试非常具有挑战性. (2认同)