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有关。
(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有关。