拆开 Hical:Router 是怎么做到 O(1) 路由匹配的?
[Hical] Router 是怎么做到 O(1) 路由匹配的?兼谈 ~40ns 的 dispatchSync 快速路径 本专栏文章:拆开 Hical · 第 2 篇 上一篇我们跟踪了一个 HTTP 请求从 socket 字节到响应序列化的全过程。走到 Router.dispatch() 这一步时我们跳过去了——现在把它展开。 一个 HTTP 框架的 Router 基本只有一件事要做:给定 method + path,找到对应的 handler。听起来简单,但"怎么找"的差异可以把延迟拉开一个数量级。 1. 三种路由、三种策略 Hical 的 Router 支持三种路由: 1 2 3 静态路由: GET /api/users → hash map O(1) 参数路由: GET /api/users/{id} → per-method vector 线性匹配 通配符路由: GET /static/*path → 优先级最低,兜底匹配 匹配优先级:静态 > 参数 > 通配符。为什么是这个顺序?静态路由一 hash 命中就返回,参数路由需要逐个匹配,通配符是兜底的——先试最快的。 2. 静态路由:透明哈希消除 string_view→string 转换 2.1 问题 静态路由的 key 是 method + path 的组合。如果存在 unordered_map 里: ...