aboutsummaryrefslogtreecommitdiffstats
path: root/benchmarks/http/run.py
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-09-26 17:39:03 +0100
committereunhhu <[email protected]>2026-09-26 17:39:03 +0100
commit62f4c51920129216ea779118c341379b5e9f4d7c (patch)
tree4ab29324b457d5afeb27bf72a0d503dd7844b561 /benchmarks/http/run.py
parent93aeb3b1e73d096bd22813955bdbe3b4c8ddaf80 (diff)
downloadpure-62f4c51920129216ea779118c341379b5e9f4d7c.tar.gz
pure-62f4c51920129216ea779118c341379b5e9f4d7c.zip
Record the app service against axum and drogon (077)
The scoreboard, 22 lines of aup served by its views and inputs, against the same service written by hand in axum and drogon on the Pi: durable posts about 76 times as many, reads level with drogon and ahead of axum with the least CPU and memory. The note keeps what the profile showed on the way (the kernel's share of a single thread, integers through printf, an owner that saved too early) and what comes next. run.py gains pure-serve-2 and waits for a server that prints its port before it listens.
Diffstat (limited to 'benchmarks/http/run.py')
-rw-r--r--benchmarks/http/run.py15
1 files changed, 11 insertions, 4 deletions
diff --git a/benchmarks/http/run.py b/benchmarks/http/run.py
index a09b4ef..7c5ab98 100644
--- a/benchmarks/http/run.py
+++ b/benchmarks/http/run.py
@@ -75,8 +75,13 @@ def put(port, key, body, expected):
def post_score(port, name):
- connection = http.client.HTTPConnection('127.0.0.1', port, timeout=30)
- connection.request('POST', '/inputs/score?points=1', name.encode(), {'Content-Length': str(len(name))})
+ for attempt in range(50): # a server may print its port a moment before it listens
+ try:
+ connection = http.client.HTTPConnection('127.0.0.1', port, timeout=30)
+ connection.request('POST', '/inputs/score?points=1', name.encode(), {'Content-Length': str(len(name))})
+ break
+ except ConnectionRefusedError:
+ time.sleep(0.05)
response = connection.getresponse()
response.read()
connection.close()
@@ -130,6 +135,8 @@ def main():
'--budget', str(args.budget)],
'pure-serve-3': lambda d: [PURE / 'build/pure-serve', '--module', args.module, '--store', d, '--port', '0',
'--budget', str(args.budget), '--threads', '3'],
+ 'pure-serve-2': lambda d: [PURE / 'build/pure-serve', '--module', args.module, '--store', d, '--port', '0',
+ '--budget', str(args.budget), '--threads', '2'],
'axum-memory': lambda d: [axum, '--port', '0'],
'axum-durable': lambda d: [axum, '--port', '0', '--durable', d],
'axum-atomic': lambda d: [axum, '--port', '0', '--atomic', d],
@@ -153,8 +160,8 @@ def main():
('total, 64 conn, keep-alive', dict(connections=64, method='total', keys=64, mode='keep-alive')),
('page 20 rows, 64 conn, keep-alive', dict(connections=64, method='page', keys=64, mode='keep-alive')),
]
- for name in ('pure-program', 'pure-serve-3', 'axum-atomic', 'drogon-atomic'):
- del servers[name] # one owner of the board's states; atomic is durable for a log
+ for name in ('pure-program', 'axum-atomic', 'drogon-atomic'):
+ del servers[name] # atomic is durable for a log already
if args.workloads:
workloads = [w for w in workloads if re.search(args.workloads, w[0])]
chosen = [name for name in servers if not args.only or name in args.only.split(',')]