惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

I
InfoQ
Hugging Face - Blog
Hugging Face - Blog
月光博客
月光博客
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
SegmentFault 最新的问题
罗磊的独立博客
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
L
LINUX DO - 最新话题
T
Threatpost
Cisco Talos Blog
Cisco Talos Blog
The GitHub Blog
The GitHub Blog
V
V2EX
SecWiki News
SecWiki News
P
Privacy & Cybersecurity Law Blog
Forbes - Security
Forbes - Security
T
Troy Hunt's Blog
S
Security @ Cisco Blogs
Martin Fowler
Martin Fowler
Attack and Defense Labs
Attack and Defense Labs
A
Arctic Wolf
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Register - Security
The Register - Security
Blog — PlanetScale
Blog — PlanetScale
The Last Watchdog
The Last Watchdog
T
Tor Project blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cisco Blogs
P
Proofpoint News Feed
O
OpenAI News
Hacker News - Newest:
Hacker News - Newest: "LLM"
小众软件
小众软件
雷峰网
雷峰网
H
Heimdal Security Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
Engineering at Meta
Engineering at Meta
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
C
Cyber Attacks, Cyber Crime and Cyber Security
Webroot Blog
Webroot Blog
C
Check Point Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
W
WeLiveSecurity
T
Threat Research - Cisco Blogs
人人都是产品经理
人人都是产品经理
Hacker News: Ask HN
Hacker News: Ask HN
The Hacker News
The Hacker News
V
Vulnerabilities – Threatpost
Microsoft Security Blog
Microsoft Security Blog

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
The Transport Raises the Floor, Not the Ceiling: GenHTTP, ASP.NET, and an io_uring Power-Up
Benny · 2026-06-26 · via DEV Community

In round one, Benny Franciscus left us with a tidy moral: performance is contextual. ASP.NET took raw throughput, GenHTTP took the workloads, everybody nodded, nobody got fired. That conclusion has aged in an interesting way, because two things changed underneath it. GenHTTP swapped engines, and a new io_uring runtime called ioxide showed up offering to re-plumb the I/O layer of whatever you point it at.

So this is a controlled experiment, not a rematch. Two stages. Stage 1 establishes the gap between stock genhttp-11 and stock aspnet-minimal. Stage 2 changes exactly one variable — the transport — on both sides, holding the application code constant, and lets the deltas confess which framework was carrying more I/O overhead. Every number below is paired with the mechanism that produced it, because a benchmark without a mechanism is just a rumor with a chart.

Stage 1 — Stock vs Stock: GenHTTP 12, ASP.NET 0

First, the correction round one earned. Benny's genhttp was the old default engine, and ASP.NET beat it on baseline by roughly 10x. genhttp-11 is GenHTTP's tuned native HTTP/1.1 engine — its own socket loop plus its routing and serialization pipeline, server and framework fused into one library. That is not "round one lied." That is GenHTTP changing the motor and the result flipping. Here is the stock board.

Workload genhttp-11 aspnet-minimal Ratio
baseline 2,075,459 1,269,768 1.63x
pipelined 17,885,664 6,887,346 2.60x
limited-conn 1,093,905 458,236 2.39x
json 834,527 577,052 1.45x
json-comp 462,495 337,876 1.37x
json-tls 682,330 511,002 1.34x
static 914,726 356,294 2.57x
upload 2,932 1,539 1.91x
crud 518,433 356,311 1.46x
async-db 196,599 169,173 1.16x
api-4 53,376 40,202 1.33x
api-16 149,741 118,886 1.26x

GenHTTP 12, ASP.NET 0. A clean sweep, and a structurally honest one.

The why is architecture, not luck. aspnet-minimal is Kestrel on the default .NET sockets transport: epoll readiness, then a syscall to actually move the bytes, then continuations dispatched onto the thread pool. Every dependency it touches has its own private I/O stack stapled on the side — Npgsql brings its own socket layer and a locked connection pool, TLS goes through user-space SslStream crypto and copies, static files go through the filesystem. General-purpose, composable, and paying a coordination tax at every layer.

genhttp-11 is a purpose-built HTTP/1.1 engine that never agreed to be general-purpose. The widest stock gaps are exactly where Kestrel's generality costs the most: pipelined 2.60x, where the bottleneck is per-request HTTP/1.1 parsing and ASP.NET's pipeline does more bookkeeping per request; static 2.57x, GenHTTP's native file path versus a filesystem round-trip; limited-conn 2.39x, where the workload is dominated by accept/close churn and Kestrel's accept path is the slower one. The narrow gaps — async-db 1.16x, json-tls 1.34x — are the tell, and worth bookmarking: those are workloads dominated by something other than HTTP, where Npgsql and SslStream drag both frameworks down toward a common floor.

Stage 2 — Power Up Both: GenHTTP 11, ASP.NET 1

Now the one variable. Both frameworks keep their entire application layer — same routing, same serialization, same handlers — and swap their I/O substrate for the ioxide io_uring runtime.

ioxide is a shared-nothing io_uring runtime: one ring per reactor, one reactor per core (capped at 64). Each reactor owns its sockets, buffers, and DB connections, so there are no cross-core locks on the hot path. SO_REUSEPORT plus multishot accept lets the kernel load-balance connections and turns one submitted accept into many. Multishot recv harvests many completions into a pre-registered buffer ring. Completions resume the request state machine inline on the reactor thread via IValueTaskSource — no thread-pool handoff, no per-await allocation — and it talks to the kernel through raw io_uring_enter, no liburing in between. Where epoll says "this socket is ready, now go syscall," io_uring says "here is the completed read," and ioxide does the continuation on the same core that owns the data.

For aspnet-minimal-ioxide the change is — almost insultingly — one line: builder.WebHost.UseIoxide(), plus ioxide.pg for the database and kTLS instead of UseHttps. HTTP/2 and HTTP/3 are intentionally omitted, because ioxide is HTTP/1.1-only with no ALPN. genhttp-11-ioxide runs GenHTTP's same pipeline on GenHTTP.Engine.Ioxide, with the same per-reactor seams for ioxide.pg and kTLS. App layer constant; substrate swapped. Anything that moves is attributable to I/O.

Workload genhttp-11-ioxide aspnet-minimal-ioxide Ratio vs stock
baseline 3,207,811 1,806,612 1.78x
pipelined 21,625,750 7,024,560 3.08x widened
limited-conn 2,572,916 1,145,776 2.25x
json 1,115,920 676,306 1.65x
json-comp 565,487 382,233 1.48x
json-tls 870,802 738,079 1.18x narrowed
static 858,611 332,365 2.58x ~
upload 2,222 1,958 1.13x collapsed
crud 651,333 555,136 1.17x narrowed
async-db 274,238 291,828 0.94x THE FLIP
api-4 55,032 48,477 1.14x
api-16 184,888 154,249 1.20x

Stock 12-0 becomes powered 11-1. ASP.NET takes async-db. To understand why that is the only flip — and why it was always going to be that one — read the per-framework power-up deltas, because the aggregate ratios hide the real story. Each cell here is measured against that framework's own stock baseline.

Workload genhttp-11 → ioxide aspnet-minimal → ioxide
baseline +55% +42%
pipelined +21% +2%
limited-conn +135% +150%
json-tls +28% +44%
crud +26% +56%
async-db +39% +73%
upload -24% +27%
static -6% -7%

The Payoff — Who Had More to Shed

Same substrate, two very different windfalls.

The database path is where ASP.NET was bleeding. async-db jumps +73% for ASP.NET versus +39% for GenHTTP; crud jumps +56% versus +26%. Mechanism: stock ASP.NET ran Npgsql, which means its own socket stack, a locked pool, and a thread-pool hop between the DB completion and the request continuation — bytes arrive on one thread, the request resumes on another. ioxide.pg deletes all of it. DB sockets ride the same ring as HTTP, the pool is per-reactor and shared-nothing, and rows stream from the driver's receive buffer straight into the HTTP response — query and response on one core, one ring, one buffer. GenHTTP gained from the same change, but it had less coordination overhead to begin with, so there was less to delete. Result: aspnet-minimal-ioxide at 291,828 overtakes genhttp-11-ioxide at 274,238. The single flip on the entire board, and it is a DB-transport effect, full stop. ASP.NET got rescued, because Npgsql's cross-thread choreography was a bigger fire to put out. The workload where the server mattered least in Stage 1 is exactly the workload that ioxide could swing — because the thing it fixed was never the server.

TLS tells the same story in miniature. json-tls gains +44% for ASP.NET versus +28% for GenHTTP, narrowing 1.34x → 1.18x. kTLS pushes record encryption into the kernel and retires Kestrel's user-space SslStream crypto and copies — and SslStream was the heavier starting point, so the heavier starting point loses more weight. Same with limited-conn: ASP.NET's accept/close churn was the worse path, so multishot accept helps it a hair more (+150% vs +135%).

Notice the pattern: ioxide removes the most where ASP.NET had the most — the plumbing. DB, TLS, connection churn. That is the floor rising.

Now the ceiling, which does not move. On raw HTTP, GenHTTP gains more: baseline +55% vs +42%, and pipelined +21% vs a rounding-error +2%. The pipelined gap widens, 2.60x → 3.08x. The mechanism is the whole thesis: pipelined is bottlenecked by Kestrel's per-request HTTP/1.1 parsing and pipeline work, which sits above the transport. Swapping sockets for a ring cannot accelerate parsing you still have to do. The ceiling is the parser, and the parser didn't change. ioxide raises the floor under both frameworks; it cannot lift application-layer request handling. GenHTTP's structural advantage there survives the power-up intact, and then some.

And, honestly, the regressions. Upload collapses from 1.91x to 1.13x — but not because ASP.NET got clever. ASP.NET's buffering path improved +27%, while GenHTTP regressed -24%: ioxide's recv buffer ring caps each slice at 16KB, so a 20MB body shatters into hundreds of completions and buffer returns. That ring is tuned for small requests, and it makes GenHTTP's otherwise-excellent bulk path pay for it; stock genhttp-11 remains GenHTTP's best uploader. Static regresses ~6-7% on both sides. ioxide.file serves static as a baked snapshot — full response, headers and body plus precompressed .br/.gz siblings, precomputed in native memory at startup and sent from a slab. But GenHTTP's FileResource overflows that 128KB write slab, so genhttp-11-ioxide routes static through IoxideFiles and still edges just under its own native path. The substrate is not a free lunch; it is a differently-priced lunch.

One belt ioxide never reaches for: HTTP/2 and HTTP/3. ioxide is HTTP/1.1-only — no framing, no HPACK, no ALPN. ASP.NET's live h2 numbers (baseline-h2 around 2.2M; static-h2 a 2.2-2.4x edge for the AOT build) are uncontested here because the powered-up variants simply do not speak those protocols. If your edge is multiplexed h2/h3, this entire experiment is beneath your actual workload, and ASP.NET keeps that crown unchallenged.

Conclusion

The transport raises the floor, not the ceiling. ioxide deletes the most overhead where ASP.NET was carrying the most — the database driver, the TLS stack, the connection churn — which closes nearly every gap and steals async-db outright. But it cannot touch the layer above itself, so GenHTTP's purpose-built HTTP/1.1 parsing and pipeline keep their lead, and on the most parsing-bound workload the gap actually grows. Stock 12-0 becomes powered 11-1, and that single point changed hands in the plumbing, exactly where the theory predicted it would.

Round one's "performance is contextual" was right; this is the same truth at higher resolution. The substrate sets your floor. The architecture above it sets your ceiling. Pick the workload, then pick the layer that owns it.

See the live filtered board and sort it yourself: https://www.http-arena.com/#sort=rps:-1&type=emerging,experimental,flagship