다음 코드는 기본적으로 (function (range n))과 같은 것을 병렬로 실행하도록합니다.미래는 어떻게 될까요?
(experiment-with-agents 10000 10 #(filter prime? %))
예를 들어, 10 개의 에이전트로 0과 10000 사이의 소수를 찾습니다.
(experiment-with-futures 10000 10 #(filter prime? %))
선물과 동일합니다.
이제 문제는 선물이있는 솔루션이 더 많은 선물로 더 빨리 실행되지 않는다는 것입니다. 예 :
; Futures
(time (experiment-with-futures 10000 1 #(filter prime? %)))
"Elapsed time: 33417.524634 msecs"
(time (experiment-with-futures 10000 10 #(filter prime? %)))
"Elapsed time: 33891.495702 msecs"
; Agents
(time (experiment-with-agents 10000 1 #(filter prime? %)))
"Elapsed time: 33048.80492 msecs"
(time (experiment-with-agents 10000 10 #(filter prime? %)))
"Elapsed time: 9211.864133 msecs"
왜? 내가 뭔가 잘못 했습니까 (아마도 Clojure에 새로 왔고 그냥 물건으로 놀아 라 ^^)? 왜냐하면 나는 미래가 실제로 그 시나리오에서 선호된다고 생각했기 때문입니다.
자료 :
(defn setup-agents
[coll-size num-agents]
(let [step (/ coll-size num-agents)
parts (partition step (range coll-size))
agents (for [_ (range num-agents)] (agent []))
vect (map #(into [] [%1 %2]) agents parts)]
(vec vect)))
(defn start-agents
[coll f]
(for [[agent part] coll] (send agent into (f part))))
(defn results
[agents]
(apply await agents)
(vec (flatten (map deref agents))))
(defn experiment-with-agents
[coll-size num-agents f]
(-> (setup-agents coll-size num-agents)
(start-agents f)
(results)))
(defn experiment-with-futures
[coll-size num-futures f]
(let [step (/ coll-size num-futures)
parts (partition step (range coll-size))
futures (for [index (range num-futures)] (future (f (nth parts index))))]
(vec (flatten (map deref futures)))))
'(concat ... 적용')은'항상'(flatten ...)'과'(flatten (map ...))'보다 대체적으로' (mapcat ...)' – noisesmith
'(map # ([[% 1 % 2]) 부분)'은'(map vector agents parts)'와 동일합니다. – soulcheck