forked from Lightbug-HQ/lightbug_http
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbench.mojo
144 lines (118 loc) · 3.82 KB
/
bench.mojo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
from benchmark import *
from lightbug_http.io.bytes import bytes, Bytes
from lightbug_http.header import Headers, Header
from lightbug_http.utils import ByteReader, ByteWriter
from lightbug_http.http import HTTPRequest, HTTPResponse, encode
from lightbug_http.uri import URI
alias headers = bytes(
"""GET /index.html HTTP/1.1\r\nHost: example.com\r\nUser-Agent: Mozilla/5.0\r\nContent-Type: text/html\r\nContent-Length: 1234\r\nConnection: close\r\nTrailer: end-of-message\r\n\r\n"""
)
alias body = bytes(String("I am the body of an HTTP request") * 5)
alias Request = bytes(
"""GET /index.html HTTP/1.1\r\nHost: example.com\r\nUser-Agent: Mozilla/5.0\r\nContent-Type: text/html\r\nContent-Length: 1234\r\nConnection: close\r\nTrailer: end-of-message\r\n\r\n"""
) + body
alias Response = bytes(
"HTTP/1.1 200 OK\r\nserver: lightbug_http\r\ncontent-type:"
" application/octet-stream\r\nconnection: keep-alive\r\ncontent-length:"
" 13\r\ndate: 2024-06-02T13:41:50.766880+00:00\r\n\r\n"
) + body
fn main():
run_benchmark()
fn run_benchmark():
try:
var config = BenchConfig()
config.verbose_timing = True
config.tabular_view = True
var m = Bench(config)
m.bench_function[lightbug_benchmark_header_encode](
BenchId("HeaderEncode")
)
m.bench_function[lightbug_benchmark_header_parse](
BenchId("HeaderParse")
)
m.bench_function[lightbug_benchmark_request_encode](
BenchId("RequestEncode")
)
m.bench_function[lightbug_benchmark_request_parse](
BenchId("RequestParse")
)
m.bench_function[lightbug_benchmark_response_encode](
BenchId("ResponseEncode")
)
m.bench_function[lightbug_benchmark_response_parse](
BenchId("ResponseParse")
)
m.dump_report()
except:
print("failed to start benchmark")
var headers_struct = Headers(
Header("Content-Type", "application/json"),
Header("Content-Length", "1234"),
Header("Connection", "close"),
Header("Date", "some-datetime"),
Header("SomeHeader", "SomeValue"),
)
@parameter
fn lightbug_benchmark_response_encode(mut b: Bencher):
@always_inline
@parameter
fn response_encode():
var res = HTTPResponse(body, headers=headers_struct)
_ = encode(res^)
b.iter[response_encode]()
@parameter
fn lightbug_benchmark_response_parse(mut b: Bencher):
@always_inline
@parameter
fn response_parse():
var res = Response
try:
_ = HTTPResponse.from_bytes(res^)
except:
pass
b.iter[response_parse]()
@parameter
fn lightbug_benchmark_request_parse(mut b: Bencher):
@always_inline
@parameter
fn request_parse():
var r = Request
try:
_ = HTTPRequest.from_bytes("127.0.0.1/path", 4096, r^)
except:
pass
b.iter[request_parse]()
@parameter
fn lightbug_benchmark_request_encode(mut b: Bencher):
@always_inline
@parameter
fn request_encode():
var req = HTTPRequest(
URI.parse("http://127.0.0.1:8080/some-path")[URI],
headers=headers_struct,
body=body,
)
_ = encode(req^)
b.iter[request_encode]()
@parameter
fn lightbug_benchmark_header_encode(mut b: Bencher):
@always_inline
@parameter
fn header_encode():
var b = ByteWriter()
var h = headers_struct
h.encode_to(b)
b.iter[header_encode]()
@parameter
fn lightbug_benchmark_header_parse(mut b: Bencher):
@always_inline
@parameter
fn header_parse():
try:
var b = headers
var header = Headers()
var reader = ByteReader(b^)
_ = header.parse_raw(reader)
except:
print("failed")
b.iter[header_parse]()