From c87bc099b014d9380bd7b0a6c44c4213046f3d67 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sat, 2 Feb 2019 20:13:45 +0200 Subject: [PATCH] char-array is faster, re-run tests --- doc/images/opensensors.png | Bin 37115 -> 31497 bytes modules/reitit-core/java-src/reitit/Trie.java | 37 +++++++----------- perf-test/clj/reitit/go_perf_test.clj | 6 ++- perf-test/clj/reitit/nodejs_perf_test.clj | 2 +- .../clj/reitit/opensensors_perf_test.clj | 2 + 5 files changed, 22 insertions(+), 25 deletions(-) diff --git a/doc/images/opensensors.png b/doc/images/opensensors.png index 94bf228a70ee06c67836a722884217eefdaa3cbb..9f65dff4a2b6560d5b78c573fda9e9107faf59b5 100644 GIT binary patch delta 28020 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 matchers) { @@ -263,13 +263,6 @@ public class Trie { } public static void main(String[] args) { - - //Matcher matcher = new StaticMatcher("/kikka", new StaticMatcher("/kukka", new DataMatcher(1))); -// Matcher matcher = -// staticMatcher("/kikka/", -// wildMatcher(Keyword.intern("kukka"), -// staticMatcher("/kikka", -// dataMatcher(1)))); Matcher matcher = linearMatcher( Arrays.asList( diff --git a/perf-test/clj/reitit/go_perf_test.clj b/perf-test/clj/reitit/go_perf_test.clj index 1a6342ce..36678094 100644 --- a/perf-test/clj/reitit/go_perf_test.clj +++ b/perf-test/clj/reitit/go_perf_test.clj @@ -20,8 +20,7 @@ ;; (defn h [path] - (fn [_] - {:status 200, :body path})) + (constantly {:status 200, :body path})) (defn add [handler routes route] (let [method (-> route keys first str/lower-case keyword) @@ -318,6 +317,7 @@ ;; 140µs (java-segment-router) ;; 60ns (java-segment-router, no injects) ;; 55ns (trie-router, no injects) + ;; 54µs (trie-router, no injects, optimized) (let [req (map->Req {:request-method :get, :uri "/user/repos"})] (title "static") (assert (= {:status 200, :body "/user/repos"} (app req))) @@ -330,6 +330,7 @@ ;; 490ns (java-segment-router, no injects) ;; 440ns (java-segment-router, no injects, single-wild-optimization) ;; 305ns (trie-router, no injects) + ;; 281µs (trie-router, no injects, optimized) (let [req (map->Req {:request-method :get, :uri "/repos/julienschmidt/httprouter/stargazers"})] (title "param") (assert (= {:status 200, :body "/repos/:owner/:repo/stargazers"} (app req))) @@ -342,6 +343,7 @@ ;; 100µs (java-segment-router, no injects) ;; 90µs (java-segment-router, no injects, single-wild-optimization) ;; 66µs (trie-router, no injects) + ;; 64µs (trie-router, no injects, optimized) (let [requests (mapv route->req routes)] (title "all") (cc/quick-bench diff --git a/perf-test/clj/reitit/nodejs_perf_test.clj b/perf-test/clj/reitit/nodejs_perf_test.clj index 27d664ba..7b30f118 100644 --- a/perf-test/clj/reitit/nodejs_perf_test.clj +++ b/perf-test/clj/reitit/nodejs_perf_test.clj @@ -69,7 +69,7 @@ ;; 25310 / 25126 "regex" - ;; 112017 / 113811 + ;; 112719 / 113959 (title "reitit") ;; wrk -d ${DURATION:="30s"} http://127.0.0.1:2048/product/foo ;; wrk -d ${DURATION:="30s"} http://127.0.0.1:2048/twenty/bar diff --git a/perf-test/clj/reitit/opensensors_perf_test.clj b/perf-test/clj/reitit/opensensors_perf_test.clj index 50ecdc47..36e02fe0 100644 --- a/perf-test/clj/reitit/opensensors_perf_test.clj +++ b/perf-test/clj/reitit/opensensors_perf_test.clj @@ -584,12 +584,14 @@ ;; 474ns (java-segment-router) ;; 373ns (trie) ;; 323ns (trie, prioritized) + ;; 289ns (trie, prioritized, zero-copy) (b! "reitit-ring" reitit-ring-f) ;; 385ns (java-segment-router, no injects) ;; 271ms (trie) ;; 240ns (trie, prioritized) (b! "reitit-ring-fast" reitit-ring-fast-f) + ;; 240ns (trie, prioritized, zero-copy) ;; 2553ns (linear-router) ;; 630ns (segment-router-backed)