This commit is contained in:
Andrew Pimenov 2026-09-04 10:05:35 +03:00 • committed by GitHub
commit f104bdbcbb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 28 additions and 3 deletions

21
benchmark.py Normal file
View file

@ -0,0 +1,21 @@
import asyncio
import httpx
import time
from netsleuth.config import Speedtest
from netsleuth.speed import tier_cloudflare, throughput_from_samples
async def main():
cfg = Speedtest(
download_sizes_bytes=[],
upload_sizes_bytes=[100000, 200000, 500000, 1000000, 2000000],
cloudflare_base_url="https://speed.cloudflare.com",
)
async with httpx.AsyncClient() as client:
began = time.perf_counter()
res = await tier_cloudflare(client, cfg, 30.0)
elapsed = time.perf_counter() - began
print(f"Elapsed: {elapsed:.3f}s")
print(f"Upload mbps: {res.upload_mbps}")
if __name__ == "__main__":
asyncio.run(main())

View file

@ -157,13 +157,17 @@ async def tier_cloudflare(client: httpx.AsyncClient, cfg: Speedtest, timeout: fl
response.raise_for_status() response.raise_for_status()
down_samples.append((len(response.content), time.perf_counter() - began)) down_samples.append((len(response.content), time.perf_counter() - began))
cfl4 = parse_server_timing_cfl4(response.headers.get("server-timing", "")) or cfl4 cfl4 = parse_server_timing_cfl4(response.headers.get("server-timing", "")) or cfl4
up_samples: list[tuple[int, float]] = []
for size in cfg.upload_sizes_bytes: async def _upload(size: int) -> tuple[int, float]:
payload = b"\x00" * size payload = b"\x00" * size
began = time.perf_counter() began = time.perf_counter()
response = await client.post(f"{cfg.cloudflare_base_url}/__up", content=payload, timeout=timeout) response = await client.post(f"{cfg.cloudflare_base_url}/__up", content=payload, timeout=timeout)
response.raise_for_status() response.raise_for_status()
up_samples.append((size, time.perf_counter() - began)) return size, time.perf_counter() - began
up_samples = await asyncio.gather(
*[_upload(size) for size in cfg.upload_sizes_bytes]
)
return SpeedResult( return SpeedResult(
method="cloudflare", method="cloudflare",
download_mbps=throughput_from_samples(down_samples), download_mbps=throughput_from_samples(down_samples),