Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (ns lab32
- (:require [clojure.test :refer :all]))
- (defn pfilter
- ([pred coll]
- (let [n 2
- cap 4]
- (pfilter pred coll n cap)))
- ([pred coll n cap]
- (let [flat (fn flat [coll]
- (lazy-seq
- (when-let [s (seq coll)]
- (if (coll? (first s))
- (concat (flat (first s)) (flat (rest s)))
- (cons (first s) (flat (rest s)))))))
- chunked (fn chunked [c]
- (lazy-seq
- (if (not-empty c)
- (cons (take cap c) (chunked (drop cap c))))))
- fut (fn [c] (doall (filter pred c)))
- fs (map #(future (fut %)) (chunked coll))
- step (fn step [[x & xs :as vs] tail]
- (lazy-seq
- (if-let [s (seq tail)]
- (cons (deref x) (step xs (rest s)))
- (map deref vs)
- )))]
- (flat (step fs (drop (dec n) fs)))
- ))
- )
- ;(let [coll (range 20)
- ; pred (fn [x] (do
- ; (println (format "lazy%d " x))
- ; (Thread/sleep 1000)
- ; (even? x)
- ; ))
- ; ]
- ; (do
- ; (time (doall (pfilter pred coll)))
- ; )
- ; )
- (defmacro mtime
- "Evaluates expr and prints the time it took. Returns the value of
- expr."
- {:added "1.0"}
- [expr]
- `(let [start# (. System (nanoTime))
- ret# ~expr]
- (/ (double (- (. System (nanoTime)) start#)) 1000000.0)))
- (deftest pfilter-test
- (testing "basic"
- (let [coll-n 20
- threads 8
- coll (range coll-n)
- pred even?]
- (is (= (pfilter pred coll threads 1) (filter pred coll)))
- (is (= (pfilter pred coll threads coll-n) (filter pred coll)))
- (is (= (pfilter pred coll 1 coll-n) (filter pred coll)))
- )
- )
- (testing "bench"
- (let [coll-n 20
- threads 8
- sleep 1000
- pred (fn [x] (do
- (Thread/sleep sleep)
- (even? x)))]
- (is (< (mtime (doall (pfilter pred (range coll-n) threads 3))) (mtime (doall (filter pred (range coll-n))))))
- )
- ))
- (run-tests 'lab32)
- (shutdown-agents)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement