diff --git a/modules/reitit-core/java-src/reitit/Trie.java b/modules/reitit-core/java-src/reitit/Trie.java index 656999a3..e994dd4d 100644 --- a/modules/reitit-core/java-src/reitit/Trie.java +++ b/modules/reitit-core/java-src/reitit/Trie.java @@ -28,11 +28,15 @@ public class Trie { boolean hasPercent = false; boolean hasPlus = false; for (int j = begin; j < end; j++) { - final char c = chars[j]; - if (c == '%') { - hasPercent = true; - } else if (c == '+') { - hasPlus = true; + switch (chars[j]) { + case '%': + hasPercent = true; + break; + case '+': + hasPlus = true; + break; + default: + break; } } return decode(chars, begin, end, hasPercent, hasPlus); @@ -151,16 +155,21 @@ public class Trie { boolean hasPlus = false; for (int j = i; j < max; j++) { final char c = path[j]; - if (c == '/') { - final Match m = child.match(j, max, path, match); - if (m != null) { - m.params.assoc(key, decode(path, i, j, hasPercent, hasPlus)); - } - return m; - } else if (c == '%') { - hasPercent = true; - } else if (c == '+') { - hasPlus = true; + switch (c) { + case '/': + final Match m = child.match(j, max, path, match); + if (m != null) { + m.params.assoc(key, decode(path, i, j, hasPercent, hasPlus)); + } + return m; + case '%': + hasPercent = true; + break; + case '+': + hasPlus = true; + break; + default: + break; } } final Match m = child.match(max, max, path, match); diff --git a/perf-test/clj/reitit/go_perf_test.clj b/perf-test/clj/reitit/go_perf_test.clj index 37259310..f62983de 100644 --- a/perf-test/clj/reitit/go_perf_test.clj +++ b/perf-test/clj/reitit/go_perf_test.clj @@ -330,7 +330,8 @@ ;; 490ns (java-segment-router, no injects) ;; 440ns (java-segment-router, no injects, single-wild-optimization) ;; 305ns (trie-router, no injects) - ;; 281ns (trie-router, no injects, optimized) - 690ns (clojure) + ;; 281ns (trie-router, no injects, optimized) + ;; 277ns (trie-router, no injects, switch-case) - 690ns clojure (let [req (map->Req {:request-method :get, :uri "/repos/julienschmidt/httprouter/stargazers"})] (title "param") (assert (= {:status 200, :body "/repos/:owner/:repo/stargazers"} (app req))) @@ -344,6 +345,7 @@ ;; 90µs (java-segment-router, no injects, single-wild-optimization) ;; 66µs (trie-router, no injects) ;; 64µs (trie-router, no injects, optimized) - 124µs (clojure) + ;; 63µs (trie-router, no injects, switch-case) - 124µs (clojure) (let [requests (mapv route->req routes)] (title "all") (cc/quick-bench @@ -357,8 +359,7 @@ (app {:request-method :get, :uri "/repos/julienschmidt/httprouter/stargazers"}) (do (require '[clj-async-profiler.core :as prof]) - (prof/start {}) - (time - (dotimes [_ 10000000] + (prof/profile + (dotimes [_ 1000000] (app {:request-method :get, :uri "/repos/julienschmidt/httprouter/stargazers"}))) - (str (prof/stop {})))) + (prof/serve-files 8080)))