Concurrency 用Clojure期货计算长和
运行此代码:Concurrency 用Clojure期货计算长和,concurrency,clojure,future,Concurrency,Clojure,Future,运行此代码: (ns playfield.core) (defn sum [start end] (reduce + (range start end))) (def size 1e8) (defn -main [& args] (println (time (sum 0 size))) (println (time (let [left (future (sum 0 (/ size 2))) right (futu
(ns playfield.core)
(defn sum
[start end]
(reduce + (range start end)))
(def size 1e8)
(defn -main
[& args]
(println (time (sum 0 size)))
(println (time (let [left (future (sum 0 (/ size 2)))
right (future (sum (/ size 2) size))]
(+ @left @right)))))
给我这个输出:
"Elapsed time: 2742.185 msecs"
4999999950000000
"Elapsed time: 2605.541 msecs"
4.99999995E15
我原以为第二个线程将占用大约一半的时间,因为我将计算分布在两个线程上。我做错了什么?我稍微修改了您的示例(在
-main
末尾添加(关机代理)
),并在两台机器上运行(lein run-m playfield.core
)它:
Retina Macbook Pro,2012年年中
- 2.3 GHz Intel Core i7
- 16GB内存
- Java(TM)SE运行时环境(build 1.7.0_45-b18)
serial: 2678.034 msecs
parallel: 1943.153 msecs
Parallel takes 72.3% of baseline.
Serial: 12390.296313 msecs
Parallel: 6856.656525 msecs
Parallel takes 55.3% of baseline.
请注意,这些结果与我最初的评论不同。该数据是从REPL运行的
联想Thinkstation S20
- 3.07GHz英特尔至强W3550
- 8GB内存
- Java(TM)SE运行时环境(build 1.7.0_45-b18)
serial: 2678.034 msecs
parallel: 1943.153 msecs
Parallel takes 72.3% of baseline.
Serial: 12390.296313 msecs
Parallel: 6856.656525 msecs
Parallel takes 55.3% of baseline.
我可以想到在进行基准测试时可能遇到的两个问题:
时间生成的,所以我不确定这是否起作用
-XX:+tieredcomployment-XX:TieredStopAtLevel=1
。对此情况进行更改有明显的区别:
$ LEIN_JVM_OPTS="" lein run -m 'speed.core'
Serial: 2496.435288 msecs
Parallel: 2045.084565 msecs
Parallel takes 81.9% of baseline.
@Giuseppe的评论指出,4个核心正在积极使用(我认为这意味着充分利用)。也许JVM有很高的内存压力,而CPU的使用是垃圾收集器疯狂地工作以使一些内存可用。然而,我无法在本地重现这一点。似乎你在使用lazy-seqs导致的每一步开销中浪费了大部分时间。秒对我来说快了两倍:
12626.003474毫秒
vs6696.957308毫秒
Btw你们要总结所有0-1e8的超级计算机是什么?我的机器需要很长时间,我已经取消了。它在2.3 GHz的4核处理器上运行,与2543.745毫秒的处理器相比,4563.518毫秒的处理器运行速度更快(未来版本的运行时间约为直接版本的55%)。您测试的机器上有多个内核,对吗?您知道JVM基准测试的技巧吗?也许可以试试@lgrapenthin,我有一个2.3 GHz的Intel Core i7(Retina Macbook Pro,2012年年中)。是的,我没有使用criterium进行基准测试,我只是花了很长时间才尝试过,而且花了很长时间。这可能是leiningens的默认JVM设置。@Giuseppe是显示整个系统CPU使用情况的图形,还是仅限于Java进程?如果是前者,它不是很有用,我建议查看java
进程中列出的CPU百分比。它显示了整个系统的CPU使用情况,但应该足以显示核心没有饱和,并且使用了所有核心