Add PERFORMANCE.md and link it plus STEALTH_PATCHES.md from README

Documents measured single-request and concurrency (5x/20x) overhead of
the context.request fast path against aiohttp: ~15-20ms/request steady
state, no serialization bottleneck through the shared context up to at
least 20 concurrent requests, browser launch (~1s) paid once at
startup.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0116i7dYLNZTXNR7Lqf439bV
This commit is contained in:
2026-09-09 14:27:44 +02:00
co-authored by Claude Sonnet 5
parent 0c3a206740
commit 23cdad8966
2 changed files with 93 additions and 1 deletions
+9 -1
View File
@@ -7,6 +7,12 @@ persistent, stealth-patched Chromium instance. Every request goes out
through the real browser's own network stack, so it carries a genuine
Chrome TLS/HTTP2/UA fingerprint instead of Python's OpenSSL-based one.
This README is the complete documentation. Two companion documents go
deeper on specific topics: [`STEALTH_PATCHES.md`](./STEALTH_PATCHES.md)
(every anti-automation patch applied, and why) and
[`PERFORMANCE.md`](./PERFORMANCE.md) (measured latency and concurrency
overhead against `aiohttp`).
## Why this exists
`requests`, `httpx`, and `aiohttp` all negotiate TLS through Python's
@@ -33,7 +39,9 @@ endpoint:
Distinct hashes, produced by the same physical request path our
`get`/`post`/etc. use — proof the fast path is not just claiming to be
Chrome, it is Chrome's own network stack.
Chrome, it is Chrome's own network stack. Measured latency and
concurrency overhead of that same fast path against `aiohttp` — steady
state, and 5×/20× concurrent — are in [`PERFORMANCE.md`](./PERFORMANCE.md).
On top of that, `stealthii` removes the JS-level automation tells a
stock headless Chromium exposes — `navigator.webdriver`, a missing