Created
September 9, 2021 20:37
-
-
Save Hendekagon/06ee05130c7fc7c7f2f042000ac79224 to your computer and use it in GitHub Desktop.
Comparison of function dispatch methods performance in Clojure
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(require '[criterium.core :as c]) | |
(defprotocol W (w [this x y])) | |
(def w1 (reify W (w [t x y] (* x y)))) | |
(c/quick-bench (w w1 4 4)) | |
; protocol dispatch | |
; Execution time mean : 6.625560 ns | |
(defrecord Wr [w]) | |
(def w2 (Wr. (fn [x y] (* x y)))) | |
(c/quick-bench ((:w w2) 4 4)) | |
; function-in-record dispatch | |
; Execution time mean : 7.944109 ns | |
(def w3 {:w (fn [x y] (* x y))}) | |
(c/quick-bench ((:w w3) 4 4)) | |
; function-in-map dispatch | |
; Execution time mean : 32.106786 ns | |
(defmulti Wm (fn [kind x y] kind)) | |
(defmethod Wm :w [_ x y] (* x y)) | |
(c/quick-bench (Wm :w 4 4)) | |
; multimethod dispatch | |
; Execution time mean : 44.309771 ns | |
; protocols are fastest, records around the same, functions in maps and multimethods slowest | |
; trade off is performance vs flexibility as protocols and functions-in-records can only dispatch | |
; on type or keyword, whereas functions-in-maps and multimethods can dispatch on vectors or anything | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment