Arrays Clojure性能-为什么;“丑陋的”&引用;“数组交换技巧”;提高lcs性能?

Arrays Clojure性能-为什么;“丑陋的”&引用;“数组交换技巧”;提高lcs性能?,arrays,performance,clojure,longest-substring,Arrays,Performance,Clojure,Longest Substring,这是“昂贵算法的Clojure性能”问题的后续。我一直在研究它,并尝试将他的一些技术应用到我自己的实验Clojure性能调优中 我想知道的一件事是“丑陋的”“数组交换技巧” 与原始方法相比,这种方法如何以及为什么能够提高性能?我怀疑Clojure数组有时不是真正的Java基元数组?如有必要,请在您的答案中引用Clojure core source。正如Chas所提到的,带有原始提示的循环是有问题的。Clojure试图在您提供提示时使int保持未绑定状态,但当它不能遵守提示时(在大多数情况下),它

这是“昂贵算法的Clojure性能”问题的后续。我一直在研究它,并尝试将他的一些技术应用到我自己的实验Clojure性能调优中

我想知道的一件事是“丑陋的”“数组交换技巧”


与原始方法相比,这种方法如何以及为什么能够提高性能?我怀疑Clojure数组有时不是真正的Java基元数组?如有必要,请在您的答案中引用Clojure core source。

正如Chas所提到的,带有原始提示的循环是有问题的。Clojure试图在您提供提示时使int保持未绑定状态,但当它不能遵守提示时(在大多数情况下),它会默默地失败。因此,他通过创建一个带有可变字段的deftype并在循环中设置这些字段来强制实现。这是一个丑陋的黑客,但绕过了编译器中的一些限制

事实上,它与对象分配有关。以下是原始算法,带有注释:

(定义我的lcs[^objects a1^objects a2]
(一)
(让[n(inc(alength a1))]
(a)减少a1 i
对初始值进行解构
[最大长度^ints上一个^ints当前值]
;;初始值-向量[long int[]int[]
[0(整数数组n)(整数数组n)]
;返回值:上一个和当前交换位置的向量。
[(减少a2 j最大长度(未经检查的最大长度);;
(让我们来配对
(如果(.等于(aget a1 i)(aget a2 j))
(未经检查的公司(aget prev j))
0)]
(aset curr(未选中的inc j)匹配len)
(如果(>匹配镜头最大镜头)
火柴杯
(最大长度)

货币兑换率(上);;不太明白@cgrand的版本并没有消除
aset
见我的答案。我还需要满足评论的最小长度要求!
      (set! curr prev)
      (set! prev bak)