used hottie to profile the example from the readme (compiled with nim c --cc:clang --debugger:native -d:release --passL:"-no-pie" beast) and got this output
What stood out was the strutils line which I believe relates to this part of httpbeast.
Using this benchmark to see if manually doing the response does anything
import benchy
import strutils
const serverInfo = "HttpBeast"
let
code = 200
body = "hello world"
serverDate = "02-20-2020"
otherHeaders = ""
const reps = 100_000
timeIt "% formatting":
for i in 0..reps:
let text = "HTTP/1.1 $#\c\L" & "Content-Length: $#\c\LServer: $#\c\LDate: $#$#\c\L\c\L$#" % [$code, $body.len, serverInfo, serverDate, otherHeaders, body]
keep text
timeIt "concating":
for i in 0..reps:
var text = ""
text &= "HTTP/1.1 "
text &= $code
text &= "\c\LContent-Length: "
text &= $body.len
text &= "\c\LServer: " & serverInfo
text &= "\c\LDate: "
text &= serverDate
text &= otherHeaders
text &= "\c\L\c\L"
text &= body
keep text
we get
name ............................... min time avg time std dv runs
% formatting ...................... 62.264 ms 62.737 ms ±0.330 x80
concating ......................... 23.907 ms 24.480 ms ±0.059 x205
So quite an improvement.
Now to benchmark actual http performance
compile command: nim c -d:release beast.nimnim file: just the file from the readme
wrk command: wrk --threads=1 http://127.0.0.1:8080 -d 10
(run shown is from most average out of 4 runs)
Before
Running 10s test @ http://127.0.0.1:8080
1 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 69.30us 30.43us 1.14ms 92.87%
Req/Sec 136.87k 18.53k 150.67k 94.00%
1359811 requests in 10.00s, 137.46MB read
Requests/sec: 135971.47
Transfer/sec: 13.75MB
after
Running 10s test @ http://127.0.0.1:8080
1 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 58.56us 27.79us 2.24ms 95.24%
Req/Sec 149.61k 21.83k 157.42k 92.00%
1488251 requests in 10.00s, 150.45MB read
Requests/sec: 148819.33
Transfer/sec: 15.04MB
used hottie to profile the example from the readme (compiled with
nim c --cc:clang --debugger:native -d:release --passL:"-no-pie" beast
) and got this outputWhat stood out was the strutils line which I believe relates to this part of httpbeast. Using this benchmark to see if manually doing the response does anything
we get
So quite an improvement. Now to benchmark actual http performance compile command:
nim c -d:release beast.nim
nim file: just the file from the readme wrk command:wrk --threads=1 http://127.0.0.1:8080 -d 10
(run shown is from most average out of 4 runs)
Before
after
seems like a nice performance boost