Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
天下一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.5k
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
60
完璧を求めない意思決定-アクセス制御基盤における制約との向き合い方
bmf_san
5
19k
AAPについて調べてみた
bmf_san
0
130
レーダーをつくる
bmf_san
0
78
契約テストとPactについて
bmf_san
0
120
5分でわかるSLO
bmf_san
2
170
権限について考える
bmf_san
2
160
自作HTTPルーターから新しいServeMuxへ
bmf_san
3
1.8k
古くなってしまったPHPフレームワークとPHPのバージョンアップ戦略
bmf_san
1
500
Other Decks in Programming
See All in Programming
Lessons from Spec-Driven Development
simas
PRO
0
150
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
340
RTSPクライアントを自作してみた話
simotin13
0
510
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
240
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
250
Modding RubyKaigi for Myself
yui_knk
0
900
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
120
運用エージェントは "作る" から "育てる" へ - 記憶と自己進化の3層設計パターン / self-evolving-agents-three-layer-agent-design
gawa
12
3.5k
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
1
620
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
140
AI駆動開発で崩れていくコードベースを立て直す
kyoko_nr_nr
1
440
3Dシーンの圧縮
fadis
1
670
Featured
See All Featured
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
280
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
71
40k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
200
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
320
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
190
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
A Soul's Torment
seathinner
6
2.9k
Everyday Curiosity
cassininazir
0
220
Abbi's Birthday
coloredviolet
2
8k
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͕ͭ͘ΕΔͣ
ʮԶΑΓڧౕ͍͔͍͠ͳ͔ͬͨʯ ʮഊΛݏͱ͍͏΄Ͳͬͨʯ ʙʢʣʙ