Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency 用Clojure期货计算长和_Concurrency_Clojure_Future - Fatal编程技术网

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.
我可以想到在进行基准测试时可能遇到的两个问题:

  • 机器没有多个内核/Java仅限于一个内核/以其他方式加载内核
  • 对JVM进行基准测试很棘手。一般情况下,建议改用。然而,我上面的数字是使用
    时间生成的,所以我不确定这是否起作用
  • 编辑

    我还有一些想法:

    正如@lgrapenthin提到的,JVM选项会影响时间。例如,lein使用以下两个选项:
    -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毫秒
    vs
    6696.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使用情况,但应该足以显示核心没有饱和,并且使用了所有核心