(require '[clojure.core.reducers :as r])
(def data (into [] (take 10000000 (repeatedly #(rand-int 1000)))))
(defn frequencies [coll]
(reduce (fn [counts x]
(merge-with + counts {x 1}))
{} coll))
(defn pfrequencies [coll]
(r/reduce (fn [counts x]
(merge-with + counts {x 1}))
{} coll))
user=> (time (do (frequencies data) nil))
"Elapsed time: 29697.183 msecs"
user=> (time (do (pfrequencies data) nil))
"Elapsed time: 25273.794 msecs"
user=> (time (do (frequencies data) nil))
"Elapsed time: 25384.086 msecs"
user=> (time (do (pfrequencies data) nil))
"Elapsed time: 25778.502 msecs"
大きなスピードアップの例を教えてもらえますか?この例では、減速機を使用した場合のスピードアップはなぜですか?
私はIntel Core i7(2コア、http://ark.intel.com/products/54617)でJava 1.7のMac OSX 10.7.5で動作しています。
coreとほぼ同じで 'fold'を使わないでくださいreduce – Ankur
2コアの' fold 'バージョンでさえ、 'clojure.core/frequencies'よりも遅いでしょう。トランジェントを使用します。 –
@ankur私はr/foldを試してみると、シード引数を省略して、このエラーが出ます:ArityException()。 java:437) –