From de993abf6274de5a68214a0bd56129b719934d03 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Wed, 8 Nov 2017 09:18:52 +0000 Subject: [PATCH] Move tests --- modules/reitit-core/src/reitit/trie.cljc | 86 -------------- .../clj/reitit/prefix_tree_perf_test.clj | 105 ++++++++++++++++++ 2 files changed, 105 insertions(+), 86 deletions(-) create mode 100644 perf-test/clj/reitit/prefix_tree_perf_test.clj diff --git a/modules/reitit-core/src/reitit/trie.cljc b/modules/reitit-core/src/reitit/trie.cljc index 66028ae9..5d47eb7a 100644 --- a/modules/reitit-core/src/reitit/trie.cljc +++ b/modules/reitit-core/src/reitit/trie.cljc @@ -196,89 +196,3 @@ :else (split node path-spec data lcs)))))) - -;; -;; testing -;; - -(def routes - [["/v2/whoami" {:name :test/route1}] - ["/v2/users/:user-id/datasets" {:name :test/route2}] - ["/v2/public/projects/:project-id/datasets" {:name :test/route3}] - ["/v1/public/topics/:topic" {:name :test/route4}] - ["/v1/users/:user-id/orgs/:org-id" {:name :test/route5}] - ["/v1/search/topics/:term" {:name :test/route6}] - ["/v1/users/:user-id/invitations" {:name :test/route7}] - ["/v1/users/:user-id/topics" {:name :test/route9}] - ["/v1/users/:user-id/bookmarks/followers" {:name :test/route10}] - ["/v2/datasets/:dataset-id" {:name :test/route11}] - ["/v1/orgs/:org-id/usage-stats" {:name :test/route12}] - ["/v1/orgs/:org-id/devices/:client-id" {:name :test/route13}] - ["/v1/messages/user/:user-id" {:name :test/route14}] - ["/v1/users/:user-id/devices" {:name :test/route15}] - ["/v1/public/users/:user-id" {:name :test/route16}] - ["/v1/orgs/:org-id/errors" {:name :test/route17}] - ["/v1/public/orgs/:org-id" {:name :test/route18}] - ["/v1/orgs/:org-id/invitations" {:name :test/route19}] - ["/v1/users/:user-id/device-errors" {:name :test/route22}] - ["/v2/login" {:name :test/route23}] - ["/v1/users/:user-id/usage-stats" {:name :test/route24}] - ["/v2/users/:user-id/devices" {:name :test/route25}] - ["/v1/users/:user-id/claim-device/:client-id" {:name :test/route26}] - ["/v2/public/projects/:project-id" {:name :test/route27}] - ["/v2/public/datasets/:dataset-id" {:name :test/route28}] - ["/v2/users/:user-id/topics/bulk" {:name :test/route29}] - ["/v1/messages/device/:client-id" {:name :test/route30}] - ["/v1/users/:user-id/owned-orgs" {:name :test/route31}] - ["/v1/topics/:topic" {:name :test/route32}] - ["/v1/users/:user-id/bookmark/:topic" {:name :test/route33}] - ["/v1/orgs/:org-id/members/:user-id" {:name :test/route34}] - ["/v1/users/:user-id/devices/:client-id" {:name :test/route35}] - ["/v1/users/:user-id" {:name :test/route36}] - ["/v1/orgs/:org-id/devices" {:name :test/route37}] - ["/v1/orgs/:org-id/members" {:name :test/route38}] - ["/v2/orgs/:org-id/topics" {:name :test/route40}] - ["/v1/whoami" {:name :test/route41}] - ["/v1/orgs/:org-id" {:name :test/route42}] - ["/v1/users/:user-id/api-key" {:name :test/route43}] - ["/v2/schemas" {:name :test/route44}] - ["/v2/users/:user-id/topics" {:name :test/route45}] - ["/v1/orgs/:org-id/confirm-membership/:token" {:name :test/route46}] - ["/v2/topics/:topic" {:name :test/route47}] - ["/v1/messages/topic/:topic" {:name :test/route48}] - ["/v1/users/:user-id/devices/:client-id/reset-password" {:name :test/route49}] - ["/v2/topics" {:name :test/route50}] - ["/v1/login" {:name :test/route51}] - ["/v1/users/:user-id/orgs" {:name :test/route52}] - ["/v2/public/messages/dataset/:dataset-id" {:name :test/route53}] - ["/v1/topics" {:name :test/route54}] - ["/v1/orgs" {:name :test/route55}] - ["/v1/users/:user-id/bookmarks" {:name :test/route56}] - ["/v1/orgs/:org-id/topics" {:name :test/route57}]]) - -(comment - (require '[io.pedestal.http.route.prefix-tree :as p]) - (def tree-old (reduce (fn [acc [p d]] (p/insert acc p d)) nil routes)) - - ;; 2.3ms - (cc/quick-bench (dotimes [_ 1000] (p/lookup tree-old "/v1/orgs/1/topics")))) - -(comment - (def tree-new (reduce (fn [acc [p d]] (insert acc p d)) nil routes)) - - ;; 3.1ms - ;; 2.5ms (string equals) - ;; 2.5ms (protocol) - ;; 2.3ms (nil childs) - ;; 2.0ms (rando impros) - ;; 1.9ms (wild & catch shortcuts) - ;; 1.5ms (inline child fetching) - ;; 1.5ms (WildNode also backtracks) - ;; 1.4ms (precalculate segment-size) - ;; 1.3ms (fast-map) - ;; 1.3ms (dissoc wild & catch-all from children) - ;; 1.3ms (reified protocols) - ;; 0.8ms (flattened matching) - ;; 0.8ms (return route-data) - ;; 0.8ms (fix payloads) - (cc/quick-bench (dotimes [_ 1000] (lookup tree-new "/v1/orgs/1/topics" {})))) diff --git a/perf-test/clj/reitit/prefix_tree_perf_test.clj b/perf-test/clj/reitit/prefix_tree_perf_test.clj new file mode 100644 index 00000000..c607d675 --- /dev/null +++ b/perf-test/clj/reitit/prefix_tree_perf_test.clj @@ -0,0 +1,105 @@ +(ns reitit.prefix-tree-perf-test + (:require [clojure.test :refer :all] + [io.pedestal.http.route.prefix-tree :as p] + [reitit.trie :as trie] + [criterium.core :as cc])) + +;; +;; testing +;; + +(def routes + [["/v2/whoami" {:name :test/route1}] + ["/v2/users/:user-id/datasets" {:name :test/route2}] + ["/v2/public/projects/:project-id/datasets" {:name :test/route3}] + ["/v1/public/topics/:topic" {:name :test/route4}] + ["/v1/users/:user-id/orgs/:org-id" {:name :test/route5}] + ["/v1/search/topics/:term" {:name :test/route6}] + ["/v1/users/:user-id/invitations" {:name :test/route7}] + ["/v1/users/:user-id/topics" {:name :test/route9}] + ["/v1/users/:user-id/bookmarks/followers" {:name :test/route10}] + ["/v2/datasets/:dataset-id" {:name :test/route11}] + ["/v1/orgs/:org-id/usage-stats" {:name :test/route12}] + ["/v1/orgs/:org-id/devices/:client-id" {:name :test/route13}] + ["/v1/messages/user/:user-id" {:name :test/route14}] + ["/v1/users/:user-id/devices" {:name :test/route15}] + ["/v1/public/users/:user-id" {:name :test/route16}] + ["/v1/orgs/:org-id/errors" {:name :test/route17}] + ["/v1/public/orgs/:org-id" {:name :test/route18}] + ["/v1/orgs/:org-id/invitations" {:name :test/route19}] + ["/v1/users/:user-id/device-errors" {:name :test/route22}] + ["/v2/login" {:name :test/route23}] + ["/v1/users/:user-id/usage-stats" {:name :test/route24}] + ["/v2/users/:user-id/devices" {:name :test/route25}] + ["/v1/users/:user-id/claim-device/:client-id" {:name :test/route26}] + ["/v2/public/projects/:project-id" {:name :test/route27}] + ["/v2/public/datasets/:dataset-id" {:name :test/route28}] + ["/v2/users/:user-id/topics/bulk" {:name :test/route29}] + ["/v1/messages/device/:client-id" {:name :test/route30}] + ["/v1/users/:user-id/owned-orgs" {:name :test/route31}] + ["/v1/topics/:topic" {:name :test/route32}] + ["/v1/users/:user-id/bookmark/:topic" {:name :test/route33}] + ["/v1/orgs/:org-id/members/:user-id" {:name :test/route34}] + ["/v1/users/:user-id/devices/:client-id" {:name :test/route35}] + ["/v1/users/:user-id" {:name :test/route36}] + ["/v1/orgs/:org-id/devices" {:name :test/route37}] + ["/v1/orgs/:org-id/members" {:name :test/route38}] + ["/v2/orgs/:org-id/topics" {:name :test/route40}] + ["/v1/whoami" {:name :test/route41}] + ["/v1/orgs/:org-id" {:name :test/route42}] + ["/v1/users/:user-id/api-key" {:name :test/route43}] + ["/v2/schemas" {:name :test/route44}] + ["/v2/users/:user-id/topics" {:name :test/route45}] + ["/v1/orgs/:org-id/confirm-membership/:token" {:name :test/route46}] + ["/v2/topics/:topic" {:name :test/route47}] + ["/v1/messages/topic/:topic" {:name :test/route48}] + ["/v1/users/:user-id/devices/:client-id/reset-password" {:name :test/route49}] + ["/v2/topics" {:name :test/route50}] + ["/v1/login" {:name :test/route51}] + ["/v1/users/:user-id/orgs" {:name :test/route52}] + ["/v2/public/messages/dataset/:dataset-id" {:name :test/route53}] + ["/v1/topics" {:name :test/route54}] + ["/v1/orgs" {:name :test/route55}] + ["/v1/users/:user-id/bookmarks" {:name :test/route56}] + ["/v1/orgs/:org-id/topics" {:name :test/route57}]]) + +(def pedestal-tree + (reduce + (fn [acc [p d]] + (p/insert acc p d)) + nil routes)) + +(def reitit-tree + (reduce + (fn [acc [p d]] + (trie/insert acc p d)) + nil routes)) + +(defn bench! [] + + ;; 2.3ms + (cc/quick-bench + (dotimes [_ 1000] + (p/lookup pedestal-tree "/v1/orgs/1/topics"))) + + ;; 3.1ms + ;; 2.5ms (string equals) + ;; 2.5ms (protocol) + ;; 2.3ms (nil childs) + ;; 2.0ms (rando impros) + ;; 1.9ms (wild & catch shortcuts) + ;; 1.5ms (inline child fetching) + ;; 1.5ms (WildNode also backtracks) + ;; 1.4ms (precalculate segment-size) + ;; 1.3ms (fast-map) + ;; 1.3ms (dissoc wild & catch-all from children) + ;; 1.3ms (reified protocols) + ;; 0.8ms (flattened matching) + ;; 0.8ms (return route-data) + ;; 0.8ms (fix payloads) + (cc/quick-bench + (dotimes [_ 1000] + (trie/lookup reitit-tree "/v1/orgs/1/topics" {})))) + +(comment + (bench!))