gpt4 book ai didi

java - Clojure 原始数组类型元数据

转载 作者:行者123 更新时间:2023-11-30 11:13:04 24 4
gpt4 key购买 nike

我做了一个简单的性能测试:创建 900000 大小的数组并读取它的所有元素。

(time (let [array (byte-array 900000)] 
(loop [i (- 900000 1)]
(when (< 0 i)
(aget array i)
(recur (- i 1))))))
"Elapsed time: 10.244612 msecs"

然后我想确定要动态创建的数组类型,为了简单起见,这里定义了重言式 HashMap :

(def types {:byte-array byte-array :int-array int-array})

现在我再次运行测试并获得了很大的性能差距:

(time (let [array ((types :byte-array) 900000)] 
(loop [i (- 900000 1)]
(when (< 0 i)
(aget array i)
(recur (- i 1))))))
"Elapsed time: 7190.233155 msecs"

解决方法:

(time (let [^bytes array ((types :byte-array) 900000)] 
(loop [i (- 900000 1)]
(when (< 0 i)
(aget array i)
(recur (- i 1))))))
"Elapsed time: 12.48304 msecs"

问题是如何动态输入hint clojure?有谁知道引擎盖下发生了什么?

最佳答案

Clojure 是一种编译型语言。您的测试代码将始终先编译,然后执行。因此很明显,代码不能同时专门针对两种不同的类型。

如果你想支持不同类型的基本数组的特化,你唯一的机会是使用宏并使用编译时常量来决定每个宏调用需要哪种特化。您可以围绕它构建便利,例如根据检测到的数组运行时类型分派(dispatch)到适当编译的函数。

关于java - Clojure 原始数组类型元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26548598/

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