为什么在clojure中并行qsort比执行常见的慢?

时间:2012-05-24 21:19:20

标签: algorithm clojure functional-programming

我正在编写并行qsort算法,但他的工作速度比普通实现慢。 我认为问题在于功能'concat'。如何加快算法速度?

(defn qsort-orig [L]
  (if  (empty? L)
    '()
    (let [[pivot & l] L]
      (concat (qsort-orig (for [y l :when (<  y pivot)] y))
              (list pivot)
              (qsort-orig (for [y l :when (>= y pivot)] y))))))

(defn qsort [L]  
(if (empty? L)
  '()
  (let [ [pivot & l] L 
        Left  (for [y l :when (<  y pivot)] y)
        Right (for [y l :when (>= y pivot)] y)]
    (concat (apply concat (pmap qsort 
                            (if (list? Left) 
                              Left 
                              (list Left))))
            (list pivot)
            (apply concat (pmap qsort 
                            (if (list? Right) 
                              Right 
                              (list Right))))))))
# for test
(time (qsort (repeatedly 10000 #(rand-int 10000))))
(time (qsort-orig (repeatedly 10000 #(rand-int 10000))))

1 个答案:

答案 0 :(得分:1)

这两者的内存分配时间很可能会消除它们之间的实时差异。

  • 如果您在recur中使用qsort-orig,那么它不会快速烧掉堆栈并且应该运行得更快,因为它将花费更少的时间来分配内存。
  • 使用apply和concat分配将为左侧和右侧的每个调用创建一个长序列,因为它构建对concat的调用,这将需要为每个调用分配内存
  • pmap为数组中的每个条目分配一个小结构(将来的调用)。