我写了一个二进制搜索函数作为一个更大的程序的一部分,但它似乎比它应该慢,并且分析显示了很多对clojure.lang.Numbers方法的调用.
我的理解是,当Clojure可以确定它可以这样做时,它可以使用原语.对clojure.lang.Numbers中方法的调用似乎表明它不是在这里使用原语.
如果我将循环变量强制为int,它会正确地抱怨recur参数不是原始的.如果我也强迫那些,代码再次起作用,但又很慢.我唯一的猜测是(quot (+ low-idx high-idx) 2)
不会产生一个原始但我不知道从哪里去.
这是我在Clojure的第一个程序,所以如果有更清洁/功能/ Clojure方法可以让我知道.
(defn binary-search
[coll coll-size target]
(let [cnt (dec coll-size)]
(loop [low-idx 0 high-idx cnt]
(if (> low-idx high-idx)
nil
(let [mid-idx (quot (+ low-idx high-idx) 2) mid-val (coll mid-idx)]
(cond
(= mid-val target) mid-idx
(< mid-val target) (recur (inc mid-idx) high-idx)
(> mid-val target) (recur low-idx (dec mid-idx))
))))))
(defn binary-search-perf-test
[test-size]
(do
(let [test-set (vec (range 1 (inc test-size))) test-set-size (count test-set)]
(time (count (map #(binary-search2 test-set test-set-size …
Run Code Online (Sandbox Code Playgroud) clojure ×1