Clojure의 지연 시퀀스 대 변환기 벤치마크

this thread에 따르면 변환기가 있는 지연 시퀀스만 사용하여 비교했습니다.

I/O 요소를 추가하기 위해 아래 프로그램을 사용하여 "fake.txt"라는 데이터 파일을 준비했습니다.

(with-open [w (io/writer "fake.txt")]
  (doseq [n (range 10000000)]
    (.write w (str n "\n"))))


F1은 지연 시퀀스 기반 버전입니다. "fake.txt"에서 데이터를 읽고 몇 단계의 계산을 수행합니다.

(defn f1
  []
  (with-open [r (io/reader "fake.txt")]
    (->> (line-seq r)
         (map parse-long)
         (map inc)
         (filter even?)
         (map inc)
         (reduce + 0))))


F2는 F1의 트랜스듀서 기반 버전입니다.

(defn f2
  []
  (with-open [r (io/reader "fake.txt")]
    (transduce (comp (map parse-long)
                     (map inc)
                     (filter even?)
                     (map inc))
               +
               (line-seq r))))


Criterium을 사용하여 평가했습니다.

(with-progress-reporting (quick-bench (f1) :verbose))
(with-progress-reporting (quick-bench (f2) :verbose))


결과는 다음과 같습니다.

#################### F1 ###################
Evaluation count : 6 in 6 samples of 1 calls.
Execution time sample mean : 3.811858 sec
Execution time mean : 3.812064 sec

#################### F2 ###################
Evaluation count : 6 in 6 samples of 1 calls.
Execution time sample mean : 1.490624 sec
Execution time mean : 1.490777 sec


지연 시퀀스 버전인 F1은 3.812064초가 걸렸습니다. 변환기 버전인 F2는 1.490777을 사용했습니다. 따라서 변환기 버전은 지연 시퀀스 버전보다 155.71% 더 빠릅니다.

간단히 말해서, 이 편향된 실험은 트랜스듀서 버전이 순수한 지연 시퀀스 버전보다 훨씬 빠르다는 것을 보여줍니다.

좋은 웹페이지 즐겨찾기