|
1 | 1 | (ns ring.bench.servlet
|
2 |
| - (:require [clojure.pprint :as pp] |
3 |
| - [jmh.core :as jmh] |
| 2 | + (:require [jmh.core :as jmh] |
4 | 3 | [ring.util.servlet :as servlet])
|
5 |
| - (:import [java.util HashMap ArrayList])) |
| 4 | + (:import [java.util HashMap ArrayList] |
| 5 | + [javax.servlet AsyncContext])) |
6 | 6 |
|
7 | 7 | (defn http-servlet-request []
|
8 | 8 | (let [headers (HashMap.
|
|
18 | 18 | (getServerName [_] "localhost")
|
19 | 19 | (getRemoteAddr [_] "localhost")
|
20 | 20 | (getRequestURI [_] "/example")
|
21 |
| - (getQueryString [_] "q=test") |
| 21 | + (getQueryString [_] "q=test") |
22 | 22 | (getScheme [_] "http")
|
23 | 23 | (getMethod [_] "GET")
|
24 | 24 | (getProtocol [_] "HTTP/1.1")
|
|
42 | 42 | (close [] (.close os))
|
43 | 43 | (flush [] (.flush os))
|
44 | 44 | (write
|
45 |
| - ([b] (.write os b)) |
| 45 | + ([b] (.write os ^int b)) |
46 | 46 | ([b off len] (.write os b off len))))))))
|
47 | 47 |
|
48 |
| -(def ring-response |
| 48 | +(defn async-context [] |
| 49 | + (reify AsyncContext |
| 50 | + (complete [_]))) |
| 51 | + |
| 52 | +(defn ring-response [body-size] |
49 | 53 | {:status 200
|
50 | 54 | :headers {"Content-Type" "application/json"}
|
51 |
| - :body "{\"hello\" \"world\"}"}) |
| 55 | + :body (apply str (repeat body-size "x"))}) |
52 | 56 |
|
53 |
| -(let [response ring-response |
54 |
| - handler (fn [_] response)] |
55 |
| - (defn servlet-handler [request response] |
56 |
| - (->> request servlet/build-request-map handler (servlet/update-servlet-response response)))) |
| 57 | +(defn servlet-handler [servlet-request servlet-response response] |
| 58 | + (let [handler (fn [_] response)] |
| 59 | + (->> servlet-request |
| 60 | + servlet/build-request-map |
| 61 | + handler |
| 62 | + (servlet/update-servlet-response servlet-response)))) |
57 | 63 |
|
58 | 64 | (def bench-env
|
59 | 65 | {:benchmarks
|
60 |
| - [{:name :build, :fn `servlet/build-request-map, :args [:state/request]} |
61 |
| - {:name :update, :fn `servlet/update-servlet-response, :args [:state/response :param/response]} |
62 |
| - {:name :handler, :fn `servlet-handler, :args [:state/request :state/response]}] |
| 66 | + [{:name :build, :fn `servlet/build-request-map, :args [:state/servlet-request]} |
| 67 | + {:name :update, :fn `servlet/update-servlet-response, :args [:state/servlet-response :state/response]} |
| 68 | + {:name :update-async, :fn `servlet/update-servlet-response, :args [:state/servlet-response :state/async-context :state/response]} |
| 69 | + {:name :handler, :fn `servlet-handler, :args [:state/servlet-request :state/servlet-response :state/response]}] |
63 | 70 | :states
|
64 |
| - {:request {:fn `http-servlet-request, :args []} |
65 |
| - :response {:fn `http-servlet-response, :args []}} |
| 71 | + {:servlet-request {:fn `http-servlet-request, :args []} |
| 72 | + :servlet-response {:fn `http-servlet-response, :args []} |
| 73 | + :response {:fn `ring-response, :args [:param/response-body-size]} |
| 74 | + :async-context {:fn `async-context, :args []}} |
66 | 75 | :params
|
67 |
| - {:response ring-response}}) |
| 76 | + {:response-body-size [128 1024 8192 65536]}}) |
68 | 77 |
|
69 | 78 | (def bench-opts
|
70 | 79 | {:type :quick
|
|
73 | 82 | (defn -main []
|
74 | 83 | (println "Benchmarking...")
|
75 | 84 | (doseq [result (jmh/run bench-env bench-opts)]
|
76 |
| - (let [[score unit] (:score result)] |
77 |
| - (println (format " %s - %.2f ops/s (σ=%.2f)" |
78 |
| - (:name result) |
79 |
| - (-> result :statistics :mean) |
80 |
| - (-> result :statistics :stdev)))))) |
| 85 | + (println (format " %-13s - %5s - %.2f ops/s (σ=%.2f)" |
| 86 | + (:name result) |
| 87 | + (-> result :params :response_body_size (or "n/a")) |
| 88 | + (-> result :statistics :mean) |
| 89 | + (-> result :statistics :stdev))))) |
0 commit comments