我的代码大多数时间都在评估分裂:确定图中多少条边从一个节点集穿过到另一个节点集。
假设bisect
是一个包含图一半节点的集合(整数),edges
是一组(有向)边列表[ [n1 n2] ...]
,其中n1,n2
也是节点。
(defn tstBisectScore
"number of edges crossing bisect"
([bisect edges]
(tstBisectScore bisect 0 edges))
([bisect nx edge2check]
(if (empty? edge2check)
nx
(let [[n1 n2] (first edge2check)
inb1 (contains? bisect n1)
inb2 (contains? bisect n2)]
(if (or (and inb1 inb2)
(and (not inb1) (not inb2)))
(recur bisect nx (rest edge2check))
(recur bisect (inc nx) (rest edge2check))))
)))
通过采样执行此代码(使用VisualVM)得出的唯一线索显示,大部分时间花在clojure.core$empty_QMARK_
上,剩下的大部分时间在clojure.core$contains_QMARK_
上。[first
和rest
只占总时间的很小一部分。]
有任何建议可以让我优化代码吗?