Hi, everyone. Long time (occasional) reader, first time writer here. In the 5.x days I played with Racket's Web servlets and found them slower than I'd expected. (My exceptions were, admittedly, quite high after seeing how much better Racket performed at other tasks than your average scripting language.) I've decided to try Web servlets out again, but this time to put some rough numbers on the performance with a reproducible benchmark.
My benchmark compares Racket's stateful and stateless servlets against the SCGI package for Racket, Caddy (HTTP server written in Go), Flask (Python web microframework), GNU Guile's Web server module, Ring/Compojure (Clojure HTTP middleware/routing library), Plug (Elixir HTTP middleware), and Sinatra (Ruby web microframework). On each of these platforms the benchmark implements a trivial web application that serves around 4K of plain text. It uses ApacheBench to stress it with a configurable number of concurrent connections. The application and ApacheBench are run in separate Docker containers, which lets you tune the memory and the CPU time available to them. I've published the source code for the benchmark at https://gitlab.com/dbohdan/racket-vs-the-world/. It should be straightforward to run on Linux with Docker (but please report any difficulties!). I've attached the results I got on a two-core VM. According to them, Racket's servlets do lag behind everything else but Sinatra. The results are for 100 concurrent connections, which is the default, but the differences in throughput are still very similar with 20 connections and quite similar with just one. I'd appreciate any feedback on these results (do they look reasonable to you?) and the code behind the benchmark (did I miss any crucial bits of configuration for the servlet?). Best, D. Bohdan -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
> grep -A 21 'Requests per second' results/* results/caddy.txt:Requests per second: 4294.27 [#/sec] (mean) results/caddy.txt-Time per request: 23.287 [ms] (mean) results/caddy.txt-Time per request: 0.233 [ms] (mean, across all concurrent requests) results/caddy.txt-Transfer rate: 18141.66 [Kbytes/sec] received results/caddy.txt- results/caddy.txt-Connection Times (ms) results/caddy.txt- min mean[+/-sd] median max results/caddy.txt-Connect: 0 1 0.9 0 12 results/caddy.txt-Processing: 0 23 11.2 21 106 results/caddy.txt-Waiting: 0 21 10.7 20 102 results/caddy.txt-Total: 0 23 11.0 22 106 results/caddy.txt-WARNING: The median and mean for the initial connection time are not within a normal deviation results/caddy.txt- These results are probably not that reliable. results/caddy.txt- results/caddy.txt-Percentage of the requests served within a certain time (ms) results/caddy.txt- 50% 22 results/caddy.txt- 66% 27 results/caddy.txt- 75% 30 results/caddy.txt- 80% 32 results/caddy.txt- 90% 38 results/caddy.txt- 95% 43 results/caddy.txt- 98% 50 -- results/compojure.txt:Requests per second: 4989.57 [#/sec] (mean) results/compojure.txt-Time per request: 20.042 [ms] (mean) results/compojure.txt-Time per request: 0.200 [ms] (mean, across all concurrent requests) results/compojure.txt-Transfer rate: 20659.95 [Kbytes/sec] received results/compojure.txt- results/compojure.txt-Connection Times (ms) results/compojure.txt- min mean[+/-sd] median max results/compojure.txt-Connect: 0 9 92.2 0 3048 results/compojure.txt-Processing: 0 11 7.2 9 228 results/compojure.txt-Waiting: 0 10 7.1 9 228 results/compojure.txt-Total: 1 20 92.8 10 3067 results/compojure.txt- results/compojure.txt-Percentage of the requests served within a certain time (ms) results/compojure.txt- 50% 10 results/compojure.txt- 66% 13 results/compojure.txt- 75% 14 results/compojure.txt- 80% 16 results/compojure.txt- 90% 20 results/compojure.txt- 95% 25 results/compojure.txt- 98% 33 results/compojure.txt- 99% 53 results/compojure.txt- 100% 3067 (longest request) -- results/flask.txt:Requests per second: 1153.20 [#/sec] (mean) results/flask.txt-Time per request: 86.715 [ms] (mean) results/flask.txt-Time per request: 0.867 [ms] (mean, across all concurrent requests) results/flask.txt-Transfer rate: 4799.74 [Kbytes/sec] received results/flask.txt- results/flask.txt-Connection Times (ms) results/flask.txt- min mean[+/-sd] median max results/flask.txt-Connect: 0 0 0.2 0 12 results/flask.txt-Processing: 2 87 5.3 85 154 results/flask.txt-Waiting: 2 86 5.3 85 154 results/flask.txt-Total: 14 87 5.3 85 154 results/flask.txt- results/flask.txt-Percentage of the requests served within a certain time (ms) results/flask.txt- 50% 85 results/flask.txt- 66% 87 results/flask.txt- 75% 88 results/flask.txt- 80% 89 results/flask.txt- 90% 92 results/flask.txt- 95% 96 results/flask.txt- 98% 103 results/flask.txt- 99% 107 results/flask.txt- 100% 154 (longest request) -- results/guile.txt:Requests per second: 2174.24 [#/sec] (mean) results/guile.txt-Time per request: 45.993 [ms] (mean) results/guile.txt-Time per request: 0.460 [ms] (mean, across all concurrent requests) results/guile.txt-Transfer rate: 8888.04 [Kbytes/sec] received results/guile.txt- results/guile.txt-Connection Times (ms) results/guile.txt- min mean[+/-sd] median max results/guile.txt-Connect: 0 0 0.1 0 10 results/guile.txt-Processing: 4 46 4.8 45 72 results/guile.txt-Waiting: 4 46 4.8 45 71 results/guile.txt-Total: 13 46 4.8 46 72 results/guile.txt- results/guile.txt-Percentage of the requests served within a certain time (ms) results/guile.txt- 50% 46 results/guile.txt- 66% 49 results/guile.txt- 75% 50 results/guile.txt- 80% 50 results/guile.txt- 90% 52 results/guile.txt- 95% 53 results/guile.txt- 98% 55 results/guile.txt- 99% 57 results/guile.txt- 100% 72 (longest request) -- results/plug.txt:Requests per second: 5278.74 [#/sec] (mean) results/plug.txt-Time per request: 18.944 [ms] (mean) results/plug.txt-Time per request: 0.189 [ms] (mean, across all concurrent requests) results/plug.txt-Transfer rate: 22125.79 [Kbytes/sec] received results/plug.txt- results/plug.txt-Connection Times (ms) results/plug.txt- min mean[+/-sd] median max results/plug.txt-Connect: 0 1 1.7 1 26 results/plug.txt-Processing: 0 18 5.8 17 71 results/plug.txt-Waiting: 0 17 5.9 16 70 results/plug.txt-Total: 0 19 5.4 18 71 results/plug.txt- results/plug.txt-Percentage of the requests served within a certain time (ms) results/plug.txt- 50% 18 results/plug.txt- 66% 20 results/plug.txt- 75% 21 results/plug.txt- 80% 22 results/plug.txt- 90% 25 results/plug.txt- 95% 29 results/plug.txt- 98% 33 results/plug.txt- 99% 37 results/plug.txt- 100% 71 (longest request) -- results/scgi.txt:Requests per second: 2643.22 [#/sec] (mean) results/scgi.txt-Time per request: 37.833 [ms] (mean) results/scgi.txt-Time per request: 0.378 [ms] (mean, across all concurrent requests) results/scgi.txt-Transfer rate: 10913.63 [Kbytes/sec] received results/scgi.txt- results/scgi.txt-Connection Times (ms) results/scgi.txt- min mean[+/-sd] median max results/scgi.txt-Connect: 0 0 0.2 0 15 results/scgi.txt-Processing: 0 38 299.9 3 55254 results/scgi.txt-Waiting: 0 37 299.9 2 55254 results/scgi.txt-Total: 0 38 299.9 3 55256 results/scgi.txt- results/scgi.txt-Percentage of the requests served within a certain time (ms) results/scgi.txt- 50% 3 results/scgi.txt- 66% 4 results/scgi.txt- 75% 4 results/scgi.txt- 80% 5 results/scgi.txt- 90% 7 results/scgi.txt- 95% 11 results/scgi.txt- 98% 1018 results/scgi.txt- 99% 1030 results/scgi.txt- 100% 55256 (longest request) -- results/sinatra.txt:Requests per second: 321.36 [#/sec] (mean) results/sinatra.txt-Time per request: 311.180 [ms] (mean) results/sinatra.txt-Time per request: 3.112 [ms] (mean, across all concurrent requests) results/sinatra.txt-Transfer rate: 1356.67 [Kbytes/sec] received results/sinatra.txt- results/sinatra.txt-Connection Times (ms) results/sinatra.txt- min mean[+/-sd] median max results/sinatra.txt-Connect: 0 0 0.2 0 7 results/sinatra.txt-Processing: 4 311 221.5 266 2024 results/sinatra.txt-Waiting: 4 306 221.5 257 2021 results/sinatra.txt-Total: 8 311 221.4 266 2025 results/sinatra.txt- results/sinatra.txt-Percentage of the requests served within a certain time (ms) results/sinatra.txt- 50% 266 results/sinatra.txt- 66% 335 results/sinatra.txt- 75% 408 results/sinatra.txt- 80% 458 results/sinatra.txt- 90% 610 results/sinatra.txt- 95% 750 results/sinatra.txt- 98% 933 results/sinatra.txt- 99% 1058 results/sinatra.txt- 100% 2025 (longest request) -- results/stateful.txt:Requests per second: 581.47 [#/sec] (mean) results/stateful.txt-Time per request: 171.977 [ms] (mean) results/stateful.txt-Time per request: 1.720 [ms] (mean, across all concurrent requests) results/stateful.txt-Transfer rate: 2423.63 [Kbytes/sec] received results/stateful.txt- results/stateful.txt-Connection Times (ms) results/stateful.txt- min mean[+/-sd] median max results/stateful.txt-Connect: 0 0 0.3 0 8 results/stateful.txt-Processing: 1 171 181.4 148 1250 results/stateful.txt-Waiting: 1 166 180.4 143 1247 results/stateful.txt-Total: 1 171 181.4 148 1251 results/stateful.txt- results/stateful.txt-Percentage of the requests served within a certain time (ms) results/stateful.txt- 50% 148 results/stateful.txt- 66% 175 results/stateful.txt- 75% 250 results/stateful.txt- 80% 258 results/stateful.txt- 90% 284 results/stateful.txt- 95% 557 results/stateful.txt- 98% 847 results/stateful.txt- 99% 975 results/stateful.txt- 100% 1251 (longest request) -- results/stateless.txt:Requests per second: 658.90 [#/sec] (mean) results/stateless.txt-Time per request: 151.769 [ms] (mean) results/stateless.txt-Time per request: 1.518 [ms] (mean, across all concurrent requests) results/stateless.txt-Transfer rate: 2746.63 [Kbytes/sec] received results/stateless.txt- results/stateless.txt-Connection Times (ms) results/stateless.txt- min mean[+/-sd] median max results/stateless.txt-Connect: 0 1 0.6 1 12 results/stateless.txt-Processing: 7 151 170.3 124 4150 results/stateless.txt-Waiting: 7 127 160.0 102 4122 results/stateless.txt-Total: 8 152 170.2 125 4150 results/stateless.txt- results/stateless.txt-Percentage of the requests served within a certain time (ms) results/stateless.txt- 50% 125 results/stateless.txt- 66% 143 results/stateless.txt- 75% 157 results/stateless.txt- 80% 166 results/stateless.txt- 90% 197 results/stateless.txt- 95% 257 results/stateless.txt- 98% 638 results/stateless.txt- 99% 792 results/stateless.txt- 100% 4150 (longest request)