1- import benchmark
2- from lightbug_http.sys.server import SysServer
3- from lightbug_http.python.server import PythonServer
4- from lightbug_http.service import TechEmpowerRouter
1+ from benchmark import *
2+ from lightbug_http.io.bytes import bytes , Bytes
3+ from lightbug_http.header import Headers, Header
4+ from lightbug_http.utils import ByteReader, ByteWriter
5+ from lightbug_http.http import HTTPRequest, HTTPResponse, encode
6+ from lightbug_http.uri import URI
57from tests.utils import (
68 TestStruct,
79 FakeResponder,
810 new_fake_listener,
911 FakeServer,
10- getRequest,
1112)
1213
14+ alias headers = bytes (''' GET /index.html HTTP/1.1\r\n Host: example.com\r\n User-Agent: Mozilla/5.0\r\n Content-Type: text/html\r\n Content-Length: 1234\r\n Connection: close\r\n Trailer: end-of-message\r\n\r\n ''' )
15+ alias body = bytes (String(" I am the body of an HTTP request" ) * 5 )
16+ alias Request = bytes (''' GET /index.html HTTP/1.1\r\n Host: example.com\r\n User-Agent: Mozilla/5.0\r\n Content-Type: text/html\r\n Content-Length: 1234\r\n Connection: close\r\n Trailer: end-of-message\r\n\r\n ''' ) + body
17+ alias Response = bytes (" HTTP/1.1 200 OK\r\n server: lightbug_http\r\n content-type: application/octet-stream\r\n connection: keep-alive\r\n content-length: 13\r\n date: 2024-06-02T13:41:50.766880+00:00\r\n\r\n " ) + body
1318
1419fn main ():
20+ run_benchmark()
21+
22+ fn run_benchmark ():
1523 try :
16- var server = SysServer(tcp_keep_alive = True )
17- var handler = TechEmpowerRouter()
18- server.listen_and_serve(" 0.0.0.0:8080" , handler)
19- except e:
20- print (" Error starting server: " + e.__str__ ())
21- return
24+ var config = BenchConfig(warmup_iters = 100 )
25+ config.verbose_timing = True
26+ config.tabular_view = True
27+ var m = Bench(config)
28+ m.bench_function[lightbug_benchmark_header_encode](BenchId(" HeaderEncode" ))
29+ m.bench_function[lightbug_benchmark_header_parse](BenchId(" HeaderParse" ))
30+ m.bench_function[lightbug_benchmark_request_encode](BenchId(" RequestEncode" ))
31+ m.bench_function[lightbug_benchmark_request_parse](BenchId(" RequestParse" ))
32+ m.bench_function[lightbug_benchmark_response_encode](BenchId(" ResponseEncode" ))
33+ m.bench_function[lightbug_benchmark_response_parse](BenchId(" ResponseParse" ))
34+ m.dump_report()
35+ except :
36+ print (" failed to start benchmark" )
37+
38+
39+ var headers_struct = Headers(
40+ Header(" Content-Type" , " application/json" ),
41+ Header(" Content-Length" , " 1234" ),
42+ Header(" Connection" , " close" ),
43+ Header(" Date" , " some-datetime" ),
44+ Header(" SomeHeader" , " SomeValue" )
45+ )
46+
47+ @parameter
48+ fn lightbug_benchmark_response_encode (inout b : Bencher):
49+ @always_inline
50+ @parameter
51+ fn response_encode ():
52+ var res = HTTPResponse(body, headers = headers_struct)
53+ _ = encode(res^ )
54+ b.iter[response_encode]()
2255
56+ @parameter
57+ fn lightbug_benchmark_response_parse (inout b : Bencher):
58+ @always_inline
59+ @parameter
60+ fn response_parse ():
61+ var res = Response
62+ try :
63+ _ = HTTPResponse.from_bytes(res^ )
64+ except :
65+ pass
66+ b.iter[response_parse]()
67+
68+ @parameter
69+ fn lightbug_benchmark_request_parse (inout b : Bencher):
70+ @always_inline
71+ @parameter
72+ fn request_parse ():
73+ var r = Request
74+ try :
75+ _ = HTTPRequest.from_bytes(" 127.0.0.1/path" , 4096 , r^ )
76+ except :
77+ pass
78+ b.iter[request_parse]()
79+
80+ @parameter
81+ fn lightbug_benchmark_request_encode (inout b : Bencher):
82+ @always_inline
83+ @parameter
84+ fn request_encode ():
85+ var req = HTTPRequest(
86+ URI .parse(" http://127.0.0.1:8080/some-path" )[URI ],
87+ headers = headers_struct,
88+ body = body
89+ )
90+ _ = encode(req^ )
91+ b.iter[request_encode]()
92+
93+ @parameter
94+ fn lightbug_benchmark_header_encode (inout b : Bencher):
95+ @always_inline
96+ @parameter
97+ fn header_encode ():
98+ var b = ByteWriter()
99+ var h = headers_struct
100+ h.encode_to(b)
101+ b.iter[header_encode]()
102+
103+ @parameter
104+ fn lightbug_benchmark_header_parse (inout b : Bencher):
105+ @always_inline
106+ @parameter
107+ fn header_parse ():
108+ try :
109+ var b = headers
110+ var header = Headers()
111+ var reader = ByteReader(b^ )
112+ _ = header.parse_raw(reader)
113+ except :
114+ print (" failed" )
115+
116+ b.iter[header_parse]()
23117
24118fn lightbug_benchmark_server ():
25119 var server_report = benchmark.run[run_fake_server](max_iters = 1 )
@@ -38,9 +132,11 @@ fn lightbug_benchmark_misc() -> None:
38132 recreating_set_report.print(benchmark.Unit.ms)
39133
40134
135+ var GetRequest = HTTPRequest(URI .parse(" http://127.0.0.1/path" )[URI ])
136+
41137fn run_fake_server ():
42138 var handler = FakeResponder()
43- var listener = new_fake_listener(2 , getRequest )
139+ var listener = new_fake_listener(2 , encode(GetRequest) )
44140 var server = FakeServer(listener, handler)
45141 server.serve()
46142
0 commit comments