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
Goで圧倒的な速度改善をした話
Search
secobaka
October 24, 2024
Programming
16
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Goで圧倒的な速度改善をした話
圧倒的ッ!圧倒的改善ッ!
僥倖ッ!伏魔殿ッッ!
secobaka
October 24, 2024
More Decks by secobaka
See All by secobaka
TypeSpec & Orvalでの自動生成が けっこう便利だった話
secobaka
0
4
Other Decks in Programming
See All in Programming
ChromeでローカルLLM
ryu1013
0
140
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
110
Domain-Driven Transformation
hschwentner
2
2.3k
contenteditable と日本語入力に向き合う
colorful12
0
200
JIS keyboard support in Omarchy
lef237
0
130
IBM Bob でAI駆動開発『QC-Playbook』
ichirokano2
0
110
残高管理から台帳サービスへの進化
artoy
1
200
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.9k
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
390
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
220
APNsからLive Activityを開始する話
yumnumm
0
170
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
380
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
10k
Designing for Timeless Needs
cassininazir
1
530
Unsuck your backbone
ammeep
672
58k
Code Review Best Practice
trishagee
74
20k
Facilitating Awesome Meetings
lara
57
7.2k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.4k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
950
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
420
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
490
Why Our Code Smells
bkeepers
PRO
340
58k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Designing for Performance
lara
612
70k
Transcript
Goで圧倒的な速度改善をした話 千株式会社 高倉 輝
自己紹介 千株式会社 ものづくり部 コンシューマー開発G フォトEC 高倉 輝 (secobaka)
GitHub: https://github.com/secobaka Qiita: https://qiita.com/secobaka 趣味: 漫才 youtube: https://www.youtube.com/@友を失った夜
これはなんの話?
Goのプログラムの パフォーマンスを改善した話
139日かかるはずの処理がッ 2分にッッッ!!! ※計算上は
その差、およそ10万倍ッ! ※計算上は
はいチーズ!フォトとは? - 幼稚園や保育園を中心に展開してい る写真販売のプラットフォーム - 入学式や運動会などのイベント・催し事の 写真を販売するEC - ユーザーは園から配布される認証キーを 登録することでイベントの写真を閲覧・購
入できるようになる
そもそもなんのプログラム? - イベントの掲載開始や掲載終了の通 知を送るプログラム - 抽出:対象をParquetファイルに吐き出す - 送信:それをメールやLINEで送る
- Parquetファイルに吐き出すところ(抽 出)で問題が起きていた
何が起きたのか? - イベント終了の通知対象が10万人を超えた日に抽出バッチが一生動き続けてしま うバグが発生していた - 10時間近くバッチが動きっぱなしになっていた - 一体なぜこんなことに...
原因を追う
そもそもどういう状況なんだっけ? - そもそもどういう状況? - ローカルでは10万件でも時間はかかるが動く - 本番では動かない - メモリリークしてそう?
- てことはメモリを積めば解決なのでは? - そんなマッチョな解決で終わらせていいのか...?
ツールを使って原因を追う - 主に以下の3つを行った - Logを仕込む - delveを使う - pprofを使う
Logを仕込む - そもそも処理がどこまで進んでるん だっけ?を確認 - 特定の処理で止まっていることが分かっ た - あとすごい数のループが走ってることも分 かった
delveを使う - Goで使えるデバッグツール - https://github.com/go-delve/delve - ブレークポイントを設定して値やトレー スの確認ができる -
思ってる値が入ってる?を確認 - 値がもっとじゃかじゃか入るはずなんだけ どあんまり入ってない? - 思った動きをしてないかも?
pprofを使う - Goで使えるプロファイリングデータの 視覚化ツール - https://github.com/google/pprof - どの辺でメモリとか処理時間食ってる の?どこがネックで遅いの?とかがわ
かる - 対象が少ない時は特にめちゃめちゃ重い ところはない - 1万件くらいからなんか特定のメソッドがや たらと重くなってる - ここに原因があるのでは...?
そして解決へ
Goの言語仕様 - Goにおける配列の表現方法 - array - 固定長配列 - var a1
[5]int - slice - 可変長配列 - var s1 []int - map - 連想配列みたいなもの - var m1 map[int]string
根本原因 - 元々はsliceを愚直にforで回していた - 計算量はO(n * k) - 今日掲載終了のイベントのslice(n)
- ユーザーが登録しているイベントの slice(k)
解決方法 - 一度イベントのsliceをmapに変換して から検索する - mapならキーで一発で持ってくることがで きる - 計算量はO(n +
k) - イベントの一覧を一度mapに変換(n) - ユーザーが登録しているイベントの slice(k)
O(n * k) がッ! O(n + k) にッッッ!
すなわち、n倍速ッッ! ※ほぼ
結論
ちゃんと計算量を考えて実装しよう! - いまは動いているように見えても、対象が増えたときも同じように動くとは限らない - 単純にバッチ内でのループ処理などだけでなく、DBにおけるn+1問題やそもそものバカ重クエリなど も含め - 計算量を考えて実装できるようになろう!