Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
天下一HTTPRouter武闘会.pdf
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
bmf_san
December 14, 2022
Programming
4.6k
8
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
天下一HTTPRouter武闘会.pdf
bmf_san
December 14, 2022
More Decks by bmf_san
See All by bmf_san
桃太郎で始めるRego入門‐今日から使えるRegoの基本編
bmf_san
0
80
完璧を求めない意思決定-アクセス制御基盤における制約との向き合い方
bmf_san
5
20k
AAPについて調べてみた
bmf_san
0
150
レーダーをつくる
bmf_san
0
87
契約テストとPactについて
bmf_san
0
130
5分でわかるSLO
bmf_san
2
190
権限について考える
bmf_san
2
170
自作HTTPルーターから新しいServeMuxへ
bmf_san
3
1.9k
古くなってしまったPHPフレームワークとPHPのバージョンアップ戦略
bmf_san
1
520
Other Decks in Programming
See All in Programming
typoなんかねぇよ
raspython3
0
690
Security issues being discussed on Web Platforms
petamoriken
0
630
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
520
Deep dive into the select statement (GopherCon UK)
jespino
0
170
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
270
Laravelのアプリケーションをどこにデプロイするか #ツナギメオフライン.9
akase244
0
120
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
490
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
1.1k
スマート反転とウェブアクセシビリティ
camiha
0
180
What We Talk About When We Talk About XP
m_seki
2
470
週末にAI-DLCを本気で回したら$1,600溶けた
hbashimizu
0
130
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Rails Girls Zürich Keynote
gr2m
96
14k
Evolving SEO for Evolving Search Engines
ryanjones
0
280
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
4
620
Mind Mapping
helmedeiros
1
350
Paper Plane
katiecoart
PRO
3
53k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
890
Heart Work Chapter 1 - Part 1
lfama
PRO
9
36k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
450
The Mindset for Success: Future Career Progression
greggifford
PRO
0
490
Odyssey Design
rkendrick25
PRO
2
800
Transcript
ఱԼҰHTTPRouterಆձ @bmf_san 2022.12.14 Makuake LT
Who am Iʁ • ࣗ࡞HTTP Routerܳਓ
ʮԶΑΓڧౕ͍ʹձ͍ʹߦ͘ʯ
Զ https://github.com/bmf-san/goblin
Goblin • ԶʹΑΔԶͷͨΊͷԶͷHTTP Router • MIT LicenseͳͷͰԶҎ֎͑Δͧ • net/httpޓ •
HTTP Routerͱͯ͠ͷجຊతͳػೳΛ͍࣋ͬͯΔͣ • Trieϕʔε • awesome-goʹܝࡌ
Trieͱ • จࣈྻͷू߹Λѻ͏ߏͷҰछ • ŧŐşŽ • https://github.com/bmf-san/road-to-algorithm- master/blob/master/data_structures/tree/trie/ trie.go
ΦϨΦϨτϥΠ
͏ͪΐͬͱৄ͍͠ • ŧŐşŽʢڵຯ࣋ͬͨਓݟͯΈ͍ͯͩ͘͞:Dʣ • https://speakerdeck.com/bmf_san/ httpdetukuruhttprutazi-zuo-ru-men
ͰɺԿͷʁ • ԶΑΓڧ͍ͭʹձ͍͍ͨ • ഊΛΓ͍ͨʢϑϥάʣ
HPCMJOͱଞͷ)5513PVUFSͷ ύϑΥʔϚϯεΛൺֱ͍ͨ͠ʂʂ
ϕϯνϚʔΧʔ࡞ͬͨΝ • https://github.com/bmf-san/go-router-benchmark • ݩʑ༏लͳϕϯνϚʔΧʔ͕͕͋ͬͨɾɾ • https://github.com/julienschmidt/go-http-routing- benchmark • ϝϯςࢭ·ͬͪΌͬͨ
• GoblinՃͷPRग़͚ͨ͠ͲClose͞ΕͪΌͬͨ..
લఏ • HTTP RouterʹΑͬͯવػೳ͕ࠩ͋Δ • ͯ͢ΛΧόʔ͢Δςετ͍͠ • શͳύϑΥʔϚϯεൺֱͰͳ͍ • ֤HTTP
RouterͷσʔλߏͱΞϧΰϦζϜͷಘҙɾෆಘҙ ͕͋ΔͷͰɺςετέʔεʹΑͬͯಘखෆಘखͷ͕ࠩग़Δ
ςετέʔε • ”୳ࡧ”ʢϧʔςΟϯάʣ͚ͩςετ • ”ૠೖ”ʢϧʔςΟϯάͷఆٛʣର֎ • Rootʢ/ʣͷϧʔςΟϯάΛ1ύλʔϯ • ੩తͳϧʔςΟϯάΛ3ύλʔϯ •
Ex. /foo, /foo/bar • ಈతͳϧʔςΟϯάΛ3ύλʔϯ • Ex. /foo/:bar, /foo/:bar/:baz • cf. https://github.com/bmf-san/go-router-benchmark/blob/ main/benchmark.go
ରͷHTTP Router • HTTP RouterιϜϦΤͷޗഐ͕બΜͩHTTP Router 14બ • ։ൃ͕ࢭ·͍ͬͯΔͷ͋Δ͕ɺߴੑೳɾߴػೳΛᨳ͍ͬͯΔͷϐοΫΞοϓ •
༗໊ॴ͍͑ͯΔͣɾɾ • bmf-san/goblin • julienschmidt/httprouter • go-chi/chi • gin-gonic/gin • uptrace/bunrouter • dimfeld/httptreemux • beego/mux • gorilla/mux • nissy/bon • naoina/denco • labstack/echo • gocraft/web • vardius/gorouter • go-ozzo/ozzo-routing
ϕϯνϚʔΧʔ࣮ߦ݁Ռ go test -bench=. -benchmem goos: darwin goarch: amd64 pkg:
github.com/go-router-benchmark cpu: VirtualApple @ 2.50GHz BenchmarkStaticRoutesRootGoblin-8 37810608 31.62 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes1Goblin-8 17207332 68.55 ns/op 16 B/op 1 allocs/op BenchmarkStaticRoutes5Goblin-8 5786544 208.3 ns/op 80 B/op 1 allocs/op BenchmarkStaticRoutes10Goblin-8 2992412 400.3 ns/op 160 B/op 1 allocs/op BenchmarkPathParamColonRoutes1Goblin-8 1907245 627.5 ns/op 409 B/op 6 allocs/op BenchmarkPathParamColonRoutes5Goblin-8 525704 2269 ns/op 965 B/op 13 allocs/op BenchmarkPathParamColonRoutes10Goblin-8 275090 4399 ns/op 1608 B/op 19 allocs/op BenchmarkStaticRoutesRootHTTPRouter-8 100000000 10.46 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes1HTTPRouter-8 100000000 10.33 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes5HTTPRouter-8 100000000 10.44 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes10HTTPRouter-8 100000000 10.36 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes1HTTPRouter-8 27414811 43.20 ns/op 32 B/op 1 allocs/op BenchmarkPathParamColonRoutes5HTTPRouter-8 10295874 114.4 ns/op 160 B/op 1 allocs/op BenchmarkPathParamColonRoutes10HTTPRouter-8 6092434 197.3 ns/op 320 B/op 1 allocs/op BenchmarkStaticRoutesRootChi-8 5429904 220.0 ns/op 304 B/op 2 allocs/op BenchmarkStaticRoutes1Chi-8 5290057 220.6 ns/op 304 B/op 2 allocs/op BenchmarkStaticRoutes5Chi-8 5434046 219.3 ns/op 304 B/op 2 allocs/op BenchmarkStaticRoutes10Chi-8 5505698 212.7 ns/op 304 B/op 2 allocs/op BenchmarkPathParamBracketRoutes1Chi-8 4445071 268.9 ns/op 304 B/op 2 allocs/op BenchmarkPathParamBracketRoutes5Chi-8 2730680 437.0 ns/op 304 B/op 2 allocs/op BenchmarkPathParamBracketRoutes10Chi-8 1888065 636.3 ns/op 304 B/op 2 allocs/op BenchmarkStaticRoutesRootGin-8 32862794 36.33 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes1Gin-8 33070339 36.07 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes5Gin-8 32586816 36.17 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes10Gin-8 32143107 37.20 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes1Gin-8 27500701 42.62 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes5Gin-8 15258900 78.41 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes10Gin-8 9522596 127.7 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutesRootBunRouter-8 64215045 18.42 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes1BunRouter-8 56828720 21.02 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes5BunRouter-8 56755030 20.99 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes10BunRouter-8 56908671 20.84 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes1BunRouter-8 35162946 33.80 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes5BunRouter-8 8425648 140.7 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes10BunRouter-8 4257427 283.7 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutesRootHTTPTreeMux-8 6690556 179.2 ns/op 328 B/op 3 allocs/op BenchmarkStaticRoutes1HTTPTreeMux-8 6562962 183.0 ns/op 328 B/op 3 allocs/op BenchmarkStaticRoutes5HTTPTreeMux-8 5362312 224.5 ns/op 328 B/op 3 allocs/op BenchmarkStaticRoutes10HTTPTreeMux-8 4219711 284.1 ns/op 328 B/op 3 allocs/op BenchmarkPathParamColonRoutes1HTTPTreeMux-8 3174328 377.0 ns/op 680 B/op 6 allocs/op BenchmarkPathParamColonRoutes5HTTPTreeMux-8 1545889 757.7 ns/op 904 B/op 9 allocs/op BenchmarkPathParamColonRoutes10HTTPTreeMux-8 807580 1474 ns/op 1742 B/op 11 allocs/op BenchmarkStaticRoutesRootBeegoMux-8 22258030 52.52 ns/op 32 B/op 1 allocs/op BenchmarkStaticRoutes1BeegoMux-8 15893838 75.32 ns/op 32 B/op 1 allocs/op BenchmarkStaticRoutes5BeegoMux-8 1000000 1071 ns/op 32 B/op 1 allocs/op BenchmarkStaticRoutes10BeegoMux-8 592300 2029 ns/op 32 B/op 1 allocs/op BenchmarkPathParamColonRoutes1BeegoMux-8 3219261 373.9 ns/op 672 B/op 5 allocs/op BenchmarkPathParamColonRoutes5BeegoMux-8 824432 1420 ns/op 672 B/op 5 allocs/op BenchmarkPathParamColonRoutes10BeegoMux-8 354176 3350 ns/op 1254 B/op 6 allocs/op BenchmarkStaticRoutesRootGorillaMux-8 2076849 574.2 ns/op 720 B/op 7 allocs/op BenchmarkStaticRoutes1GorillaMux-8 2066920 579.6 ns/op 720 B/op 7 allocs/op BenchmarkStaticRoutes5GorillaMux-8 1967010 610.1 ns/op 720 B/op 7 allocs/op BenchmarkStaticRoutes10GorillaMux-8 1824106 658.2 ns/op 720 B/op 7 allocs/op BenchmarkPathParamBracketRoutes1GorillaMux-8 1339666 895.5 ns/op 1024 B/op 8 allocs/op BenchmarkPathParamBracketRoutes5GorillaMux-8 526460 2262 ns/op 1088 B/op 8 allocs/op BenchmarkPathParamBracketRoutes10GorillaMux-8 238946 5008 ns/op 1751 B/op 9 allocs/op BenchmarkStaticRoutesRootBon-8 88309966 13.51 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes1Bon-8 87832992 13.51 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes5Bon-8 86620446 13.48 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes10Bon-8 87585646 14.03 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes1Bon-8 6392168 186.3 ns/op 304 B/op 2 allocs/op BenchmarkPathParamColonRoutes5Bon-8 4628920 259.3 ns/op 304 B/op 2 allocs/op BenchmarkPathParamColonRoutes10Bon-8 3381514 355.9 ns/op 304 B/op 2 allocs/op BenchmarkStaticRoutesRootDenco-8 79634784 14.46 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes1Denco-8 79188319 14.38 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes5Denco-8 79437754 14.36 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes10Denco-8 74332171 15.32 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes1Denco-8 19618006 60.16 ns/op 32 B/op 1 allocs/op BenchmarkPathParamColonRoutes5Denco-8 8545141 140.5 ns/op 160 B/op 1 allocs/op BenchmarkPathParamColonRoutes10Denco-8 5004351 239.7 ns/op 320 B/op 1 allocs/op BenchmarkStaticRoutesRootEcho-8 33267644 35.72 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes1Echo-8 30976101 38.24 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes5Echo-8 21207642 56.36 ns/op 0 B/op 0 allocs/op BenchmarkStaticRoutes10Echo-8 12649693 94.39 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes1Echo-8 26137147 45.25 ns/op 0 B/op 0 allocs/op BenchmarkPathParamColonRoutes5Echo-8 11194768 106.2 ns/op 0 B/op 0 allocs/op
$47ʹՃͯ͠εϓγͰཧͨ͠
static-root • ςετέʔεɿ/ • goblinதؒͱ͍ͬͨײ͡ • ্ҐʢTop 4ʣͱͷࠩ݁ߏ͋Δ
static-1 • ςετέʔεɿ/foo • goblin͜ͷஈ֊Ͱmemallocs͕ग़ͯ͠·͏
static-5 • ςετέʔεɿ/foo/bar/baz/qux/quux • goblinmemallocs1ճͰࡁΜͰ͍Δ͕ɺbeego/muxʹൈ͔ΕΔ • ্Ґ͕ڧ͍ɻύϑΥʔϚϯεྼԽ͕΄ͱΜͲͳ͍ • static-1 ~
5Λશ෦·ͱΊͨέʔεͰͷςετ͢ΕΑ͔ͬͨ.. pathparam ಉ༷
static-10 • ςετέʔεɿ/foo/bar/baz/qux/quux/corge/grault/garply/waldo/fred • goblin͞ΒʹॱҐΛམͱ͢ • ্ҐϝϞϦׂΓ͕ͯগͳ͍ • beego/muxϝϞϦׂΓͯগͳΊ͕ͩɺ࣮ߦΊ
pathparam-1 • ςετέʔεɿ/foo/:bar • ্Ґੑೳ͕፰߅͍ͯ͠Δ • goblinॳઓ͔Βݫ͍͠ઓ͍ • staticͷͱ͖HTTP Routerʹ܉্͕͕͕ͬͨɺpathparamGinͷ΄͏͔
• ginͷ෦HTTP Routerϕʔεͷ࣮ʹͳ͍ͬͯΔ
pathparam-5 • ςετέʔεɿ/foo/:bar/:baz/:qux/:quux/:corge • goblinϫʔετ1ʹ • pathparam-3͘Β͍ݟ͓͖͔ͯͩͬͨ͘
pathparam-10 • ςετέʔεɿ/foo/:bar/:baz/:qux/:quux/:corge/:grault/:garply/:waldo/:fred/:plugh • ginڧ͗͢ • goblin͞Μ…
݁Ռൃද • static෦ • HTTP Router, Bon, Denco͕Top3 • goblin্ҐͱͷԿ͔͑ΒΕͳ͍นΛײͨ͡
• pathpara෦ • gin, ozzo-routing, echo͕Top3 • goblin࠷ۙΞʔΧΠϒ͞Εͨ͋Β͍͠gorilla/muxͱྑ͍উෛ • ্Ґͷσʔλߏߴʹ࠷దԽ͞Εͨ • echoɺginɺhttprouterɺbonɺchi RadixɺdencoDouble array • ՐΛݟΔΑΓ໌Β͔͕ͩɺΦϨΦϨτϥΠͰউͯͳ͍ • খखઌͷվળͰ͍͚ͭͳ͍ɻߴͳ͕ඞཁ • ߴͳͷ࠾༻ˠϚΠΫϩͳνϡʔχϯά • ֤HTTP Routerͷ࣮ͪΌΜͱݟͯͳ͍ͷͰݚڀ͍ͨ͠ͱ͜Ζ
ఱԼҰHTTPRouterಆձʹࢀՃ͠Α͏ • ࣗ࡞HTTP RouterΛ࡞ͬͯࢀઓ͍ͨ͠ਓ • ŧŐşŽʢ؆қతͳTrieϕʔεͷHTTP Routerʣ • https://github.com/bmf-san/introduction-to-golang-http- router-made-with-net-http
• 1Ոʹ1HTTP Router͕ͭ͘ΕΔͣ
ʮԶΑΓڧౕ͍͔͍͠ͳ͔ͬͨʯ ʮഊΛݏͱ͍͏΄Ͳͬͨʯ ʙʢʣʙ