2x speed with LookupRouter & fast-map on clj

This commit is contained in:
Tommi Reiman 2017-08-20 20:40:50 +03:00
parent 1ea6b55849
commit bbcf0c8350
3 changed files with 14 additions and 4 deletions

View file

@ -1037,10 +1037,12 @@
pedestal-f #(pedestal/find-route cqrs-routes-pedestal {:path-info % :request-method :post})] pedestal-f #(pedestal/find-route cqrs-routes-pedestal {:path-info % :request-method :post})]
;; 125ns ;; 125ns
;; 62ns (fast-map)
(bench! routes false "reitit" reitit-f) (bench! routes false "reitit" reitit-f)
;; 272ns ;; 272ns
;; 219ns (fast-assoc) ;; 219ns (fast-assoc)
;; 171ns (fast-map)
(bench! routes false "reitit-ring" reitit-ring-f) (bench! routes false "reitit-ring" reitit-ring-f)
;; 172ns ;; 172ns

View file

@ -142,12 +142,12 @@
(route-names [_] (route-names [_]
names) names)
(match-by-path [_ path] (match-by-path [_ path]
(data path)) (impl/fast-get data path))
(match-by-name [_ name] (match-by-name [_ name]
(if-let [match (lookup name)] (if-let [match (impl/fast-get lookup name)]
(match nil))) (match nil)))
(match-by-name [_ name params] (match-by-name [_ name params]
(if-let [match (lookup name)] (if-let [match (impl/fast-get lookup name)]
(match params)))) (match params))))
(defn lookup-router (defn lookup-router
@ -170,7 +170,7 @@
(if name (if name
(assoc lookup name #(->Match p meta handler % p)) (assoc lookup name #(->Match p meta handler % p))
lookup)]) [{} {}] compiled)] lookup)]) [{} {}] compiled)]
(->LookupRouter routes names data lookup)))) (->LookupRouter routes names (impl/fast-map data) (impl/fast-map lookup)))))
(defn router (defn router
"Create a [[Router]] from raw route data and optionally an options map. "Create a [[Router]] from raw route data and optionally an options map.

View file

@ -139,3 +139,11 @@
(defn fast-assoc (defn fast-assoc
#?@(:clj [[^clojure.lang.Associative a k v] (.assoc a k v)] #?@(:clj [[^clojure.lang.Associative a k v] (.assoc a k v)]
:cljs [[a k v] (assoc a k v)])) :cljs [[a k v] (assoc a k v)]))
(defn fast-map [m]
#?@(:clj [(java.util.HashMap. m)]
:cljs [m]))
(defn fast-get
#?@(:clj [[^java.util.HashMap m k] (.get m k)]
:cljs [[m k] (m k)]))