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
パフォーマンスチューニングで Web 技術を深掘り直す
Search
Shunsuke Mano
September 20, 2025
Programming
18
5k
パフォーマンスチューニングで Web 技術を深掘り直す
フロントエンドカンファレンス東京 2025 での発表資料です。
https://fec-tokyo.github.io/2025/
Shunsuke Mano
September 20, 2025
Tweet
Share
More Decks by Shunsuke Mano
See All by Shunsuke Mano
高度な型付け、どう教える?
progfay
4
2.4k
Provenance in JSR
progfay
1
170
Other Decks in Programming
See All in Programming
CSC305 Lecture 06
javiergs
PRO
0
210
After go func(): Goroutines Through a Beginner’s Eye
97vaibhav
0
310
Introducing ReActionView: A new ActionView-Compatible ERB Engine @ Kaigi on Rails 2025, Tokyo, Japan
marcoroth
3
970
CSC509 Lecture 06
javiergs
PRO
0
260
Model Pollution
hschwentner
1
190
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
260
Le côté obscur des IA génératives
pascallemerrer
0
140
大規模アプリのDIフレームワーク刷新戦略 ~過去最大規模の並行開発を止めずにアプリ全体に導入するまで~
mot_techtalk
0
410
ソフトウェア設計の実践的な考え方
masuda220
PRO
4
540
クラシルを支える技術と組織
rakutek
0
200
overlayPreferenceValue で実現する ピュア SwiftUI な AdMob ネイティブ広告
uhucream
0
170
CI_CD「健康診断」のススメ。現場でのボトルネック特定から、健康診断を通じた組織的な改善手法
teamlab
PRO
0
200
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
Site-Speed That Sticks
csswizardry
11
890
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
900
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.2k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Embracing the Ebb and Flow
colly
88
4.8k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
51k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
9
580
Automating Front-end Workflow
addyosmani
1371
200k
Building Applications with DynamoDB
mza
96
6.7k
Transcript
2025.09.21 | FEC Tokyo 2025 | @progfay パフォーマンスチューニングで Web 技術を深掘り直す
Name: 眞野 隼 輔 ま の しゅんすけ
@progfay ・ 株式会社リクルート所属 (2020 ~) ・ Web Frontend Engineer ・ 普段は Web の動向を追っかけている *この発表は個 人 の 見 解であり、所属する組織の公式 見 解ではありません。
本発表のテーマ パフォーマンスチューニングから得られる学びについて
本発表のテーマ パフォーマンスチューニングから得られる学びについて ではない! 「 手 を動かさないと得られない学びがある」という話
「学び 方 を変えてみよう!」という話
• 勉強がフロントエンドに偏っている • React についての勉強ばかりで、通信の仕組みについて 学ぶ機会がない • 新しくて有名な技術は古い技術よりも 常に 優れていると思っている
• HTTP/ 1 . 1 より HTTP/ 2 , JPEG より WebP • まだ学んでない Web の側 面 に触れたい 想定視聴者
• スピードハッカソン研修の紹介 • パフォーマンスチューニングの何が良いか? • 本学習 方 法の実践について 発表の流れ
https://techblog.recruit.co.jp/article-5841/
スピードハッカソンとは 👨💻 Web Page Server • イメージ: Web フロントエンド版 ISUCON*
* "ISUCON" は、LINEヤフー株式会社の商標または登録商標です。
• イメージ: Web フロントエンド版 ISUCON* スピードハッカソンとは 👨💻 Web Page Server
ISUCON* はここを速くする スピードハッカソンの対象はこっち * "ISUCON" は、LINEヤフー株式会社の商標または登録商標です。
スピードハッカソンの 目 的 👨💻 Web Page Server Browser フロントエンド インフラ
Network Web の構成要素をそれぞれ学ぶ
• 特定のライブラリやフレームワーク、ツールの知識に (極 力 ) 依らない • Pure な HTML
/ CSS / JavaScript で構成された Web サイトを対象とする • リアルワールドさを学ぶことが主 目 的ではない • 競技中のボトルネックには「実際にありそう」も「そうはならんやろ」も両 方 出てくる • Performance Tuning のやり 方 を体系的には教えない • 計測 → 改善のループは実際に 手 を動かして学んだ 方 が早そう スピードハッカソンでやらないこと
• チーム戦 (1 チーム 3 ~ 4 名) • チームごとに環境と
高 速化対象の Web サイトのコードが渡される • Web サイトのパフォーマンスを計測してスコア化する Benchmarker が 用 意されている • 競技中は計測結果がスコアボードに表 示 される • 研修後に全体の振り返りと解説 研修概要
• メディアサイトの 一 覧画 面 っぽいサイト • ページ 自 体が超
長 い • 大 量の画像が含まれている • インタラクションは少ない • 初期状態では Node.js による静的ファイル配信のみ • 最新の Google Chrome で動作すれば OK とする チューニング対象の Web サイト <img> <img> <img> <img> <img> <img> <img> <img> <img> <img> <img> <img>
• Puppeteer と Lighthouse でシナリオを実 行 する 1 . Navigation
2 . 上から下までスクロール 3 . 機能 1 を使う 4 . 機能 2 を使う • Lighthouse の report からスコア算出 Benchmark https://web.dev/articles/lighthouse-user-flows
• 画像サイズが表 示 するサイズよりも 大 きい (表 示 サイズの 8
倍) • 初期ロード時に全ての画像が読み込まれる • 不要なライブラリ (JavaScript, CSS) が含まれている • gzip 圧縮されていない • 謎の激重スクリプトが読み込まれている • etc... ページが遅くなっている原因
1 . Lighthouse で計測した結果を確認する 2 . Diagnostics / Opportunities から改善できそうなものに取り組む
3 . 修正できたらベンチマークを実 行 する 4 . これを繰り返す 競技者はどうやってパフォーマンス改善するか? https://example.com の Diagnostics
• 競技のサポートをする • 「ssh ってどうやるの?」「なにもしてないのにこわれた」 • 技術的な質問に答える • 「HTTP/ 2
化ってどうやればいい?」「gzip 圧縮って何?」 • 改善のヒントを与える • 「画像のファイルサイズを確認してみよう」「indent って実は消しても動くんです」 講師の役割
研修のテーマ 裏テーマ: Web の 奥深さ を知ってもらう 何がパフォーマンスを毀損するかを知ってもらい パフォーマンスを維持するための 文 化醸成
を 目 指す
1 . 楽しい 2 . 普段とは違う 角 度から学べる 3 .
技術の深掘りが求められる 本研修の何が良いか?
• 一 般的な研修は座学が多いため、飽きてしまう • グループワーク & 競争をさせることで、研修参加のモチベーションを引き出す • 研修のマンネリ解消も狙っている •
研修のアンケートの結果、満 足 率が 高 かった • 参加者全員から「この研修には参加意義がある」と評価を頂いた 「楽しい」は正義!
1 . 楽しい 2 . 普段とは違う 角 度から学べる 3 .
技術の深掘りが求められる 本研修の何が良いか?
What's「普段の学び 方 」 自 分の持つ知識を中 心 に、隣接する技術や領域を学ぶ 👨💻 Frontend Backend
Infra Design Browser
What's「普段の学び 方 」 自 分の持つ知識を中 心 に、隣接する技術や領域を学ぶ ✅ ✅ 👨💻
✅ ✅ Frontend Backend Infra Design Browser
What's「普段の学び 方 」 自 分の持つ知識を中 心 に、隣接する技術や領域を学ぶ ✅ ✅ ✅
✅ 👨💻 ✅ ✅ ✅ ✅ Frontend Backend Infra Design Browser
👨💻 Poor High Performance という軸で Sort する
👨💻 High Bottleneck に遭遇する Poor
👨💻 High Poor 解決すると次の Bottleneck に遭遇する ✅
👨💻 High Poor 発 見 → 改善 → 解消を繰り返す ✅
✅ ✅ ✅ ✅ ✅ ✅ ✅
✅ ✅ 👨💻 ✅ ✅ ✅ ✅ ✅ ✅ ✅
✅ ✅ ✅ 👨💻 ✅ ✅ ✅ ✅ 自 分の現在地 Performance という軸 主観的 ・ 相対的 客観的 ・ 絶対的 モチベーションを保ちつつ、普段と違う 角 度から学べる! 興味分野に近い Performance を改善したい
1 . 楽しい 2 . 普段とは違う 角 度から学べる 3 .
技術の深掘りが求められる 本研修の何が良いか?
• 取り扱う問題は実際に動作している Web Application • Lighthouse はパフォーマンス改善の提案をしてくれる • しかし、その通りにしても必ず改善されるわけではない 技術の深掘りが求められる
パフォーマンスを改善するには 技術の深掘り が必要になる
• 初期状態では HTTP/ 1 . 1 を使っているため Lighthouse から指摘される •
多重化やヘッダ圧縮により 高 速になるらしい Diagnostics - Uses HTTP/ 2 HTTP/2 offers many benefits over HTTP/1.1, including binary headers, multiplexing, and server push. ref. https://developer.chrome.com/docs/lighthouse/best-practices/uses-http2
• 初期状態では HTTP/ 1 . 1 を使っているため Lighthouse から指摘される •
多重化、サーバープッシュ、ヘッダ圧縮により 高 速になるらしい Diagnostics - Uses HTTP/ 2 HTTP/2 offers many benefits over HTTP/1.1, including binary headers, multiplexing, and server push. ref. https://developer.chrome.com/docs/lighthouse/best-practices/uses-http2 HTTP/ 2 にすると スコアが下がる 😱
HTTP/ 1 . 1 v.s. HTTP/ 2 (HTTP Level) HTTP/
1 . 1 HTTP/ 2 ブラウザは並列に 6 Connection までしか張れない (HTTP の Head of Line Blocking) 1 Connection 上にリクエストが 多重化される
HTTP/ 1 . 1 v.s. HTTP/ 2 (TCP Level) HTTP/
1 . 1 HTTP/ 2 Request: Connection = 1 : 1 Request: Connection = N : 1 A1 A2 A3 B1 B2 B3 C1 C2 C3 A1 A2 C1 A3 B1 B2 B3 C2 C3
HTTP/ 1 . 1 v.s. HTTP/ 2 (Packet Loss) HTTP/
1 . 1 HTTP/ 2 Connection が分離されているため 他の Connection に影響しない TCP の順序制御により Packet Loss すると全体が遅れてしまう (TCP の Head of Line Blocking) A1 A2 A3 B1 B2 B3 C1 C2 C3 ❌ A2 B, C 完了 A 完了 A3 B1 B2 A, B, C 完了 再送 再送 Lost Lost A1 A2 C1 A3 B1 B2 B3 C2 C3 ❌ HTTP/ 2 は HTTP/ 1 . 1 よりも Packet Loss に弱い
• メディアサイトの 一 覧画 面 っぽいサイト • ページ 自 体が超
長 い • 大 量の画像が含まれている • インタラクションは少ない • 初期状態では Node.js による静的ファイル配信のみ • 最新の Google Chrome で動作すれば OK とする チューニング対象の Web サイト <img> <img> <img> <img> <img> <img> <img> <img> <img> <img> <img> <img> 再 掲
現状 • benchmark では意図的に粗悪な通信環境をシミュレートしている (Network throttling) • 大 きな画像が 大
量に、初期ロード時に読み込まれる 仮説 • パケットロスの発 生 率が 高 くなってしまう • TCP の Head of Line Blocking により 画像読み込みの完了までが遅れてしまう? なぜ HTTP/ 1 . 1 より HTTP/ 2 のほうがスコアが下がったのか?
改善 • 画像のファイルサイズを 小 さくする (表 示 サイズまで縮 小 するなど)
• 初期ロード時には Above the fold のみの読み込みを 行 う (Lazy loading) 結果 • HTTP/ 1 . 1 と HTTP/ 2 で 比 較した結果、スコアに 大 きな違いはなかった • ボトルネックがネットワークではなくなったと考えられる 仮説の検証
• ほとんどの画像が JPEG で配信されており、Lighthouse は WebP に変換することを提案してくる • 実際に変換するとファイルサイズは 60%
ほどに! Opportunities - Serve images in next-gen formats しかし WebP に変換するとスコアが下がる場合も... AVIF と WebP は、従来の JPEG や PNG と 比 較して圧縮率と品質の 面 で優れた画像形式です。 JPEG や PNG ではなくこれらの形式で画像をエンコードすると、 読み込みが速くなり、モバイルデータの使 用 量を抑えることができます。 ref. https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images
• WebP には Block Prediction という 手 法が使われている • decode
したい Block の情報を、decode 済みの周囲の Block を元に予測する • これにより 高 い圧縮率を実現できる • 一 方 で decode 処理は逐次実 行 になってしまう Block Prediction https://web.dev/learn/images/webp#block_prediction
前提 • benchmark では CPU slowdown も 行 なっている •
画像の内在サイズが 大 きい 仮説 • 画像の内在サイズが 大 きいせいで decode 処理の実 行 時間の差が顕著になっている? なぜ WebP にしたらスコアが落ちたのか?
改善 • 画像の内在サイズを 小 さくする (表 示 サイズまで縮 小 するなど)
結果 • JPEG と WebP で 比 較した結果、スコアに 大 きな違いはなくなった • ボトルネックが画像ではなくなったと考えられる なぜ WebP にしたらスコアが落ちたのか?
• 「有名で新しい技術は常に優れているか?」には "No" と答えられる • しかし「それはどんな時か?」と聞かれて答えられる 人 は少ない • 深い知識を得る機会は、能動的に学びに
行 かない限り滅多にない • それこそ実際に 手 を動かさないと遭遇できない 技術の深掘りから得られる学び
知識 知恵 ただ知っている 活 用 できる 記憶する 体験する 技術の深掘り によって
知識は知恵へと昇華される
本研修の何が良いか? 1 . 楽しい 2 . 普段とは違う 角 度から学べる 3
. 技術の深掘りが求められる → 学びのモチベーションを保つ → 学びの軸を相対から絶対に → 知識を知恵に昇華する
Known Unknown Known Unknown Known-Knowns Unknown-Knowns Known-Unknowns Unknown-Unknowns Unkown-Unknowns に遭遇できる機会が
比 較的多いイメージ
• 理解が追いついてなくても開発が進んでしまう時代 • 「なんかわからないけど問題が発 生 した」という場 面 は今以上に増えてくるはず • 問題解決のためには広く深い知恵が必要になってくる
AI 時代でも有効な学習法か?
• 理解が追いついてなくても開発が進んでしまう時代 • 「なんかわからないけど問題が発 生 した」という場 面 は今以上に増えてくるはず • 問題解決のためには広く深い知恵が必要になってくる
AI 時代でも有効な学習法か? Let's 実践!
• まずスピードハッカソンを開催します Let's 実践
• まずスピードハッカソンを開催します ← ハードルめちゃ 高 い! Let's 実践 競技型イベントの開催って超 大
変... (;´Д`) Let's 実践
• 自 作の Web Application のパフォーマンスをチューニングする • 最初は初期表 示 だけをチューニングする
(計測 → 考察 → 改善のループ) • 慣れてきたら難易度を上げてみるのも良い • Lighthouse user flows を使ってユーザー操作もチューニングの対象にする • 想定しうるユーザーのうち、もっとも端末 spec が低そうな環境をシミュレートする Let's 実践 (パフォーマンス編)
• パフォーマンスのような 普段とは違う切り 口 で学ぶ ことが 大 事 • 例えばセキュリティ:
• 攻撃者の視点に 立 ってみる • CTF の Web 問に挑戦してみる • RFC の Security Considerations を読んでみる • 他にも切り 口 はたくさんあるはず! Let's 実践 (別路線編)
• スピードハッカソン研修では 普段とは違う学び 方 」ができる • パフォーマンスという絶対軸で Web の 見
え 方 を変える • 技術の深掘りによって知識は知恵へと昇華される • 結果: 普段触れない技術範囲を学べたり、問題解決能 力 が向上したりする • パフォーマンスやセキュリティなど、普段とは違う切り 口 で Web を捉え直すことで実践できる まとめ