clojure reduce 函数使用所有内核,即使它看起来是单线程的

clojure reduce function uses all cores even though it seems to be single threaded

(defn sum [numbers]
  (reduce + numbers))

(def numbers (into [] (range 0 100000000)))

(time (sum numbers))

以上是运行的代码。

简单地把很多数字加起来。

这行在repl中执行了多次:
(time (sum numbers)) 每次它几乎完全获得所有核心 运行.

查看 jvisualvm,创建的线程不多。

但是这段代码使用了我的 6 核笔记本电脑上可用的所有 12 个超线程。

幕后发生了什么使这成为可能?

感谢评论。

与范围的大小有关

在我的笔记本电脑上,大约有 7000 万个数字时,一切正常。

当它达到大约 8000 万时,堆大小增长很多,所用时间增长非常显着,所有内核都开始工作。视觉虚拟机显示更多 GC activity 正在发生。

所以上面的评论可能是正确的,它与GC有关。