我对clotre.core函数looking at重新分组:

(defn re-groups [^java.util.regex.Matcher m]
    (let [gc  (. m (groupCount))]
      (if (zero? gc)
        (. m (group))
        (loop [ret [] c 0]
          (if (<= c gc)
            (recur (conj ret (. m (group c))) (inc c))
             ret)))))

并认为将其重写为多方法将是“更好”的选择:
(defmulti re-groups (fn [^java.util.regex.Matcher m] (.groupCount m)))
(defmethod re-groups 0 [m] (.group m))
(defmethod re-groups :default [m]
        (let [idxs (range (inc (.groupCount m)))]
             (reduce #(conj %1 (.group m %2)) [] idxs)))

但是,在比较时间时,我惊讶地发现重写速度要慢4倍:
clojure.core: "Elapsed time: 668.029589 msecs"
multi-method: "Elapsed time: 2632.672379 msecs"

这是多方法的自然结果,还是这里还有其他问题?

最佳答案

Clojure多方法允许基于任意调度函数的运行时多态行为。这对于构建临时的层次结构和抽象非常强大,但是您要为这种灵活性付出巨大的性能损失。您可能希望使用协议(protocol)重新实现您的解决方案。仅在需要完全的运行时类型灵活性时才使用多方法。

关于performance - Clojure多方法本质上是缓慢的吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7260797/

10-11 00:07