gpt4 book ai didi

arrays - 在 Clojure 中优化数组变异

转载 作者:行者123 更新时间:2023-12-03 15:51:10 25 4
gpt4 key购买 nike

阅读了一些关于这个主题的博客文章后,我发现在 Clojure 中改变一个数组是这样的:

(defn m [xs ys] 
(dotimes [i (count xs)]
(aset #^ints ys (int i)
(int (* (int 3) (int (aget #^ints xs (int i))))))))

哪里 (def xs (into-array Integer/TYPE (range 1000000)))(def ys (into-array Integer/TYPE (range 1000000)))
根据 Criterium,平均需要 14 毫秒,而 Java 也是如此,
public static int[] m(int[] x, int[] y)
{
for(int i=0; i<x.length; i++)
y[i] = 3*x[i];
return y;
}

平均需要 800us。 **

我是否尽我所能让事情进展得更快,还有什么我可以走优化之路吗?

** 我使用 Criterium 对这些进行计时 (report-result (bench (m xs ys )) :verbose)(report-result (bench (. Test m xs ys)) :verbose)

最佳答案

如果你想要速度,你需要进入原始世界,直到你完成才离开它。以盒装开头没有用 Integer i然后在每个使用站点将其转换为原语。也许你可以做 dotimes产生整数(类型提示 i 的声明),但不确定。我知道有效的是 loop-recur使用循环变量的原始初始值设定项构造:(loop [i (int 0)] ... (recur (unchecked-inc i)) .此外,在您的示例中,您有 (int 3) .您需要let提前,以免在每次迭代中重复拆箱。

顺便说一句,您可以使用 (int-array (range 1000000))创建您的初始化数组,只需 (int-array 1000000)对于空的。

更新

从 Clojure 1.3 开始,由于它增强了对原语的支持,我上面写的大部分内容不再适用。 dotimes已经使用原始算术,所以你需要编写以获得完整的性能

(dotimes [i (alength ^ints xs)] 
(aset ^ints ys i (unchecked-multiply (aget ^ints xs i) 3)

基本上没有 int必要的构造函数,并使用 unchecked-multiply .

关于arrays - 在 Clojure 中优化数组变异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10169518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com