diff --git a/perf-test/clj/reitit/cors_perf_test.clj b/perf-test/clj/reitit/cors_perf_test.clj new file mode 100644 index 00000000..a87544bc --- /dev/null +++ b/perf-test/clj/reitit/cors_perf_test.clj @@ -0,0 +1,43 @@ +(ns reitit.cors-perf-test + (:require [reitit.perf-utils :refer :all] + [ring.middleware.cors :as cors])) + +;; +;; start repl with `lein perf repl` +;; perf measured with the following setup: +;; +;; Model Name: MacBook Pro +;; Model Identifier: MacBookPro113 +;; Processor Name: Intel Core i7 +;; Processor Speed: 2,5 GHz +;; Number of Processors: 1 +;; Total Number of Cores: 4 +;; L2 Cache (per Core): 256 KB +;; L3 Cache: 6 MB +;; Memory: 16 GB +;; + +(def app + (cors/wrap-cors + (fn [_] {:status 200, :body "ok"}) + :access-control-allow-origin #"http://example.com" + :access-control-allow-headers #{:accept :content-type} + :access-control-allow-methods #{:get :put :post})) + +(def cors-request + {:request-method :options + :uri "/" + :headers {"origin" "http://example.com" + "access-control-request-method" "POST" + "access-control-request-headers" "Accept, Content-Type"}}) + +(defn cors-perf-test [] + + ;; 0.04µs + (b! "ring-cors: pass" (app {})) + + ;; 15.85µs + (b! "ring-cors: preflight" (app cors-request))) + +(comment + (cors-perf-test)) diff --git a/perf-test/clj/reitit/perf_utils.clj b/perf-test/clj/reitit/perf_utils.clj index 56113dc0..8f565331 100644 --- a/perf-test/clj/reitit/perf_utils.clj +++ b/perf-test/clj/reitit/perf_utils.clj @@ -54,6 +54,20 @@ (println ~@body) (cc/quick-bench ~@body))) +(defmacro b! [name & body] + `(do + (title ~name) + (println) + (println "\u001B[33m" ~@body "\u001B[0m") + (let [{[lower#] :lower-q :as res#} (cc/quick-benchmark (do ~@body) nil) + µs# (* 1000000 lower#) + ns# (* 1000 µs#)] + (println "\u001B[32m\n" (format "%1$10.2fns" ns#) "\u001B[0m") + (println "\u001B[32m" (format "%1$10.2fµs" µs#) "\u001B[0m") + (println) + (cc/report-result res#)) + (println))) + (defn valid-urls [router] (->> (for [name (reitit/route-names router) diff --git a/project.clj b/project.clj index 8b2a3176..e00a4cd2 100644 --- a/project.clj +++ b/project.clj @@ -104,6 +104,7 @@ [funcool/promesa "2.0.1"] [com.clojure-goes-fast/clj-async-profiler "0.3.1"] + [ring-cors "0.1.12"] [com.bhauman/rebel-readline "0.1.4"]]} :1.9 {:dependencies [[org.clojure/clojure "1.9.0"]]}