perf(router): index exact static handlers - #31
Conversation
Benchmark d’intégration — toutes les optimisations HTTPJ’ai assemblé localement, sans pousser de branche d’intégration, les têtes de Méthode : même orb et même suite que le baseline initial, Node 24.19, serveur CPU 2, autocannon CPU 4/6, 3 répétitions, chauffe 2 s + mesure 5 s, ordre randomisé. Tous les runs retenus ont 0 erreur, 0 timeout et 0 non-2xx.
Comparaison dans le même run final :
Conclusion honnête : le cumul apporte un gros saut et dépasse Adonis dans plusieurs cas, mais ne dépasse pas encore Nest/Fastify hors POST. Par rapport à l’intégration précédente |
Co-authored-by: Upd4ting <upd4ting@gmail.com> Amp-Thread-ID: https://ampcode.com/threads/T-01a019cf-706b-77bc-a2f3-64727e1e5647
4da22ef to
f3bf6bf
Compare
Résumé
HandlerResultet des paramètres videsanyet multi-handlersL'index contient uniquement des chemins enregistrés, jamais les URL reçues. Il est activé pour les handlers HTTP et WebSocket mono-handler ; prefix/postfix/monitor restent sur le pipeline existant.
Rebase #29 + #30
Head
f3bf6bf6d064965885d9c582898574995230b7b8, rebasé surf97225872255552f35fe148a3f0b618995631620.La résolution conserve strictement :
src/implementations/api/index.tsLe retrait récursif retourne le nombre réellement supprimé :
handlerCountsreste donc correct, y compris lorsque plusieurs handlers d'un même niveau partagent un ID, et l'index exact est invalidé au même endroit.Compatibilité vérifiée
anyBenchmarks rebased
Baseline :
f972258(#29 + #30). Candidat :f3bf6bf(#29 + #30 + #31).Orb x64, Node 20.9.0, autocannon 8, loopback, réponse
"ok", pipelining=1. Chaque chiffre est la moyenne de 5 répétitions alternées baseline/candidat, après chauffe de 1 s, fenêtres de 2 s. p99 vaut 0 ms à la résolution milliseconde d'autocannon ; 0 erreur partout.Pile HTTP complète
L'objectif 40k est atteint sur la route simple et sur la dernière route / 10 000 à c=10. La dernière route / 1 000 atteint 39,94k à c=100, soit 61 req/s sous le seuil. Le -0,88 % statique / 10 000 c=100 et le -2,49 % pipeline sont inférieurs ou proches de la variance observée. Le contrôle dynamique mérite davantage d'attention : le miss exact ajoute nécessairement un lookup Map avant le trie.
Micro-routeur
La régression micro des misses est réelle et constitue la limite principale de cette approche ; les algorithmes du trie dynamique/catch-all eux-mêmes restent inchangés.
Mémoire
Après GC forcé et en moyennant les processus c=10/c=100, surcoût de heap d'enregistrement relatif à la baseline : environ +0,19 MiB à 1 000 routes et +1,64 MiB à 10 000 routes (~172 octets/entrée à 10k). L'index référence directement le callback existant ; le coût vient de la clé normalisée, de la Map et de la métadonnée d'invalidation.
Comparaison indicative, même fixture statique 1 000
Même orb, chemin, réponse et protocole. Nest/Fastify n'exécutent pas le pipeline Antelope. Adonis reste exclu plutôt que mesuré via un faux standalone : son bootstrap applicatif et ses providers sont nécessaires à une comparaison honnête.
Validation
pnpm install --frozen-lockfilepnpm buildpnpm dlx @antelopejs/core module test .— 132 tests passantspnpm lintorigin/main...HEADinspecté ; seulssrc/server.tset les tests perf(router): index exact static handlers #31 changent