【发布时间】:2014-01-12 14:09:20
【问题描述】:
运行此代码:
(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
我预计第二个将花费大约一半的时间,因为我将计算分布在两个线程上。我做错了什么?
【问题讨论】:
-
由于使用了惰性序列,您似乎大部分时间都浪费在每一步的开销上。
-
对我来说第二快两倍:
12626.003474 msecsvs6696.957308 msecs -
顺便说一句,你们必须用什么超级计算机来总结所有 0-1e8?我的机器需要很长时间,我已经取消了它。它在 2.3 GHz 4 核处理器上运行
-
我得到了
4563.518 msecsvs2543.745 msecs(未来版本大约需要直接版本的 55% 的时间)。您正在测试的机器上确实有多个内核,对吗?您知道对 JVM 进行基准测试的技巧吗?也许改用criterium? @lgrapenthin,我有一个 2.3 GHz Intel Core i7(Retina Macbook Pro,2012 年中)。 -
是的,我没有使用 criterium 进行基准测试,我只是尝试了一段时间,并且一直持续。这可能是 leiningens 默认的 JVM 设置。
标签: concurrency clojure future