Warm tip: This article is reproduced from serverfault.com, please click

multithreading-clojure reduce函数使用所有内核,即使它似乎是单线程的

(multithreading - clojure reduce function uses all cores even though it seems to be single threaded)

发布于 2020-11-27 16:20:30
(defn sum [numbers]
  (reduce + numbers))

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

(time (sum numbers))

上面是运行的代码。

只需将大量数字相加即可。

此行在repl中多次执行:
(time (sum numbers)) 每次几乎使所有内核都完全运行。

在此处输入图片说明

查看jvisualvm,并没有创建太多线程。

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

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

Questioner
Cui Pengfei 崔鹏飞
Viewed
0
Cui Pengfei 崔鹏飞 2020-11-28 13:42:12

感谢评论。

它与范围的大小有关。

在我的笔记本电脑上,当大约有7,000万个数字时,一切都很好。

当它达到8000万左右时,堆的大小就会增长很多,所需的时间会大大增加,并且所有内核都可以正常工作。可视vm显示更多的GC活动正在发生。

因此,上面的评论可能是正确的,这与GC有关。